Как получить данные из запущенной задачи в Python(Django)
У меня есть скрипт для сравнения и перемещения моих файлов, который должен вызываться
cmp_object = my_cmp.Compare('/mnt/f/somedir', '/mnt/f/newdir')
cmp_object.main()
и класс Compare определяется как
class Compare:
def __init__(self, path1, path2):
self.path1 = path1
self.path2 = path2
self.totalFileNumber = getTotalFileNumber(path1)
self.totalFileSize = getTotalFileSize(path1)
self.progress = 0
self.progressPercent = 0
self.status = 'Not started'
self.started = False
self.finished = False
def start(self):
self.status = 'Started'
self.started = True
self.finished = False
def update(self, index):
self.progress = index
self.progressPercent = round(
self.progress / self.totalFileNumber * 100, 2)
self.status = f'{self.progressPercent}%'
if self.progressPercent == 100:
self.status = 'Finished'
self.finished = True
def getStatus(self):
return self.status
def getProgress(self):
return self.progressPercent
def getTotalFileNumber(self):
return self.totalFileNumber
def getTotalFileSize(self):
return self.totalFileSize
def isStarted(self):
return self.started
def isFinished(self):
return self.finished
def main(self):
self.start()
for index, file in enumerate(listAllFiles(self.path1)):
compareFiles(file, self.path2 + file[len(self.path1):])
self.update(index)
self.update(self.totalFileNumber)
self.finished = True
, в котором есть функции для получения и установки некоторых состояний, таких как прогресс, статус и завершение. Я запускаю это на бэкенде Django, где я буду получать информацию из бэкенда, задавая интервал...
Я использую кэш для установки и получения состояний в разных представлениях, но я не уверен, как я могу продолжать обновлять кэш во время выполнения основной операции?
моя точка зрения:
@api_view(['GET'])
def start_sync(request):
cmp_object = my_cmp.Compare('/mnt/f/somedir', '/mnt/f/newdir')
cache.set('status', 'started', 100)
# part 1
cmp_object.main()
# part 2
while not cmp_object.isFinished():
print(cmp_object.getStatus())
cache.set('total_files', cmp_object.getTotalFileNumber(), 100)
cache.set('total_size', cmp_object.getTotalFileSize(), 100)
cache.set('progress', cmp_object.getProgress(), 100)
cache.set('status', cmp_object.getStatus(), 100)
time.sleep(1)
cache.set('status', 'finished', 100)
return Response({'done': True})
Я хочу выполнить задачу 2 во время выполнения задачи 1 (копирование файлов)... Будет ли использование celery хорошим выбором для решения этой проблемы?
Вариант 1 - вы можете вызвать функцию задачи 2 в функции задачи 1. Вариант 2 - использовать celery. Однако Celery больше подходит для асинхронной работы. Celery будет полезен, если вы хотите запустить задачу без необходимости ожидания пользователем ее завершения.