我正在使用django和芹菜。我有一个长期运行的芹菜任务,我希望它报告进度。我正在这样做:
@shared_task
def do_the_job(tracker_id, *args, **kwargs):
while condition:
#Do a long operation
tracker = ProgressTracker.objects.get(pk=tracker_id)
tracker.task_progress = F('task_progress') + 1
tracker.last_update = timezone.now()
tracker.save(update_fields=['task_progress', 'last_update'])
问题是,在任务完成之前,应该向用户显示进度的视图无法看到更新。有没有办法让 django orm 忽略这一个表的事务?还是就这一个写?
您可以使用绑定任务为任务定义自定义状态,并在执行期间设置/更新状态:
@celery.task(bind=True)
def show_progress(self, n):
for i in range(n):
self.update_state(state='PROGRESS', meta={'current': i, 'total': n})
您可以转储当前正在执行的任务的状态以获取进度:
>>> from celery import Celery
>>> app = Celery('proj')
>>> i = app.control.inspect()
>>> i.active()