【发布时间】:2018-03-25 22:51:08
【问题描述】:
运行时间相对较长的任务被委派给在另一台服务器上单独运行的 celery worker。
但是,结果被添加回关系数据库(根据task_descr.id 作为键更新表,见下文),worker 使用ignore_result。
从 Flask 应用程序请求的任务:
task = app.celery.send_task('tasks.mytask', [task_descr.id, attachments])
问题是在 Flask 端的事务尚未关闭时请求任务。这会导致竞争条件,因为有时 celery worker 在 Flask 应用程序中的事务结束之前完成任务。
仅在成功交易后发送任务的正确方法是什么?
或者工人应该在尝试有条件的UPDATE之前检查task_descr.id的可用性并重试任务(这感觉太复杂的安排)?
Run function after a certain type of model is committed 的回答讨论了类似的情况,但这里任务发送是明确的,因此不需要在某些模型中监听更新/插入。
【问题讨论】:
标签: flask transactions celery race-condition