如何在 celery 任务中强制 django-orm 中的单个保存的 db 提交
Posted
技术标签:
【中文标题】如何在 celery 任务中强制 django-orm 中的单个保存的 db 提交【英文标题】:How do I Force db commit of a single save in django-orm in a celery task 【发布时间】:2019-12-03 00:03:54 【问题描述】:我正在使用 django 和 celery。我有一个长期运行的 celery 任务,我希望它报告进度。我正在这样做:
@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 忽略这张表的事务?还是只写这一篇?
【问题讨论】:
您可以使用flower
跟踪任务进度。 flower.readthedocs.io/en/latest
这对于我们的运维团队来说看起来不错,但我只想向用户显示一个进度条。
【参考方案1】:
您可以使用bound tasks 为您的任务定义custom states 并在执行期间设置/更新状态:
@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()
【讨论】:
有趣。这将如何处理实际上是组和和弦的大图的任务?因为我也有一些。以上是关于如何在 celery 任务中强制 django-orm 中的单个保存的 db 提交的主要内容,如果未能解决你的问题,请参考以下文章
如何在任务中获取芹菜结果模型(使用 django-celery-results)
如何在 Celery 任务中使用 Flask-SQLAlchemy
Python Celery - 如何在其他任务中调用芹菜任务
如何判断任务是不是已经在 django-celery 中排队?