Как получить данные из запущенной задачи в 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 будет полезен, если вы хотите запустить задачу без необходимости ожидания пользователем ее завершения.

Вернуться на верх