有没有办法处理多个芹菜工人与原子块相同的任务?

时间:2017-07-20 18:09:24

标签: django multithreading celery atomic

我有这项任务

def some_task(self, param):
    do_some_stuff_that_might_break_with_models()
通常我可以这样做:

def some_task(self, param):
    try:
        with transaction.atomic():
            do_some_stuff_that_might_break_with_models()
    except:
        self.retry(....)

但是通过这样做,似乎我有几个工作人员执行此任务,它会因为原子阻塞而锁定数据库。但如果我摆脱它,我的尝试除了会生气。我怎么能处理这个?我尝试用独特的哈希预处理我的输入,然后将每个块分派给它自己的工作者并摆脱原子和try块但是这样做我失去了重试/跟踪哪些任务失败的能力。我仍然可以看到从管理面板到djcelery的失败,但不在任务本身内。

1 个答案:

答案 0 :(得分:0)

您是否确认可以像这样锁定数据库?我希望上下文管理器退出任何异常,回滚事务:https://docs.python.org/3/reference/datamodel.html#object.exit

如果您正在使用Redis并希望完全避免并发访问,那么我已成功将python-redis-lock作为分布式锁定。您可以在阻止模式下使用它。