如何使用transaction.on_commit编写芹菜组或链



我正在使用django 3.0.2,python 3.6.6,celery 4.3.0和redis服务器4.0.9。我想创建一些在保存模型后运行的任务链和任务组(transaction.on_commit(。我可以让个人任务以这种方式工作,但我似乎无法设计出正确的咒语来使团体或连锁店使用transaction.on_commit。

侧边栏:我在使用transaction.on_commit时扩展了芹菜任务类以"隐藏"lamba 的东西,因为我总是必须查找正确的格式 - 有关详细信息,请参阅 https://browniebroke.com/making-celery-work-nicely-with-django-transactions/。在我的代码中,我使用 task.delay_on_commit 来替换 transaction.on_commit 和 lambda。

回到主线故事。我尝试了这段代码,但失败了,说我的任务中的对象查询不存在。

jobs = group(tasks.clean_document_image.delay_on_commit(self.document_id, key, values[key]) for key in values).apply_async()

clean_document_image获取上传的图像(document_id对象的 FileField(并创建不同大小的图像的多个副本(值字典中的键是副本的宽度,值字典中的值只是大小的字符串名称 - 例如,thumb、xsmall、xxxlarge 等(。请注意,我尝试延迟组的每个元素,直到保存 FileField 的事务完成。

当我运行组的这种"仿真"时,它按预期工作,带有 FileField 的对象已保存,并且具有 document_i 的查找工作正常。

for key in values:
tasks.clean_document_image.delay_on_commit(self.document_id, key, values[key])

创建一组在保存 django 对象之前不会启动的任务的 rght 方法是什么?换句话说,如何将transaction.on_commit合并到一组任务中?

谢谢!

马克

我发现这有效:

from django.db import transaction
transaction.on_commit(lambda: chain(task1.si(args), 
task2.si(args), 
task3.si(args)).delay())

.si 适用于不返回值作为链中下一个任务的输入的任务。如果您希望 task1 的输出由 task2 使用,请使用 task1.s(args(。task2 的第一个参数必须是 task1 的输出值。

相关内容

  • 没有找到相关文章

最新更新