Прогресс выполнения задачи сельдерея

Модуль Celery позволяет отслеживать прогресс выполнения задач. Для этого используется функция on_progress, которая вызывается в момент обновления прогресса. Вот пример:

        
            from celery.result import AsyncResult
            from celery import current_app

            @current_app.task(bind=True)
            def my_task(self):
                total_steps = 100
                for i in range(total_steps):
                    # Ваш код выполнения задачи здесь
                    self.update_state(state='PROGRESS', meta={'current': i, 'total': total_steps})
                    # Другие действия

            task_id = 'your_task_id'

            task_result = AsyncResult(task_id)
            if task_result.state == 'PROGRESS':
                progress = task_result.info.get('current', 0) / task_result.info.get('total', 1) * 100

            print(f"Прогресс задачи: {progress}%")
        
    

В этом примере мы определяем функцию my_task как задачу Celery и обновляем состояние с помощью update_state. Затем мы получаем текущее состояние задачи с помощью AsyncResult и вычисляем прогресс в процентах.

Детальный ответ

Прогресс задачи в Celery

Прогресс задачи представляет собой важный аспект в Celery, который позволяет отслеживать и сообщать о текущем состоянии выполнения задачи. Это особенно полезно, когда задачи требуют больше времени для завершения и пользователю нужна информация о прогрессе выполнения.

Прогресс на основе периодических обновлений

Одним из способов отслеживания прогресса задачи в Celery является использование периодических обновлений. Это означает, что задача будет периодически отправлять обновления о своем текущем состоянии, чтобы пользователь мог видеть прогресс выполнения. Рассмотрим пример:

    
    from celery import Celery, current_task
    import time
    
    app = Celery('progress_task', broker='redis://localhost:6379/0')
    
    @app.task(bind=True)
    def long_running_task(self):
        for i in range(10):
            time.sleep(1)
            current_task.update_state(state='PROGRESS', meta={'current': i, 'total': 10})
        return 'Task completed'
    
    

В этом примере мы создаем задачу с именем "long_running_task". Внутри задачи есть цикл, который выполняется в течение 10 секунд и периодически обновляет состояние задачи с помощью метода "update_state". Методу передается состояние "PROGRESS" и мета-данные, включающие текущий и общий прогресс задачи.

Получение прогресса задачи

Теперь, когда задача отправляет периодические обновления, нам нужно получать эту информацию в интерфейсе пользователя. Мы можем сделать это, вызвав метод "AsyncResult" и используя его свойство "info". Рассмотрим пример:

    
    from celery.result import AsyncResult
    
    task_id = '1a2b3c4d'
    result = AsyncResult(task_id)
    
    if result.state == 'PROGRESS':
        progress = result.info.get('current')
        total = result.info.get('total')
        percent_complete = (progress / total) * 100
        print(f"Прогресс выполнения: {progress}/{total} ({percent_complete}%)")
    
    

В этом примере мы создаем объект "AsyncResult" с помощью идентификатора задачи "task_id". Затем мы проверяем текущее состояние задачи и, если оно равно "PROGRESS", мы получаем информацию о прогрессе из свойства "info". Мы вычисляем процент выполнения и выводим его в консоль.

Использование прогресса в пользовательском интерфейсе

Получив информацию о прогрессе задачи, мы можем использовать ее в пользовательском интерфейсе. Например, мы можем отображать прогресс в виде прогресс-бара или в процентном соотношении. Рассмотрим пример с использованием Flask:

    
    from flask import Flask, render_template
    from celery.result import AsyncResult
    
    app = Flask(__name__)
    
    @app.route('/task_progress/')
    def task_progress(task_id):
        result = AsyncResult(task_id)
    
        if result.state == 'PROGRESS':
            progress = result.info.get('current')
            total = result.info.get('total')
            percent_complete = (progress / total) * 100
            return render_template('progress.html', progress=progress, total=total, percent_complete=percent_complete)
        else:
            return 'Задача завершена'
    
    

В этом примере мы создаем маршрут "/task_progress/" для получения прогресса задачи по идентификатору "task_id". Мы проверяем текущее состояние задачи и, если оно равно "PROGRESS", мы передаем прогресс, общий прогресс и процент выполнения в шаблон "progress.html" для отображения в пользовательском интерфейсе.

Вот пример шаблона "progress.html", где мы просто отображаем прогресс в виде прогресс-бара:

    
    <h1>Прогресс задачи</h1>
    <div class="progress">
        <div class="progress-bar" role="progressbar" style="width: {{ percent_complete }}%">
            <span>{{ progress }}/{{ total }}</span>
        </div>
    </div>
    
    

В завершение, прогресс задачи в Celery является полезным функционалом, который помогает отслеживать и сообщать пользователю о текущем состоянии выполнения задачи. С помощью периодических обновлений, получения информации о прогрессе и использования ее в пользовательском интерфейсе, мы можем предоставить более детализированную информацию о выполнении задач. Будьте терпеливы и наслаждайтесь программированием с Celery!

Видео по теме

How to Create a Celery Task Progress Bar in Django

CeleryProgressbar demo

An HTMX progress bar connected to a Celery task

Похожие статьи:

Прогресс выполнения задачи сельдерея