Прогресс выполнения задачи сельдерея
Модуль 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!