如何在 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 中排队?

如何在 django 中将 api 放入 celery 任务中?

如何使用 celery 守护进程调用 celery 任务