我有这项任务
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的失败,但不在任务本身内。
答案 0 :(得分:0)
您是否确认可以像这样锁定数据库?我希望上下文管理器退出任何异常,回滚事务:https://docs.python.org/3/reference/datamodel.html#object.exit。
如果您正在使用Redis并希望完全避免并发访问,那么我已成功将python-redis-lock作为分布式锁定。您可以在阻止模式下使用它。