创建一个只执行一次的Celery任务
我已经看过Celery文档里的相关文章(Cookbook :: Creating Tasks),不过我对里面建议的解决方案不是很满意。我有一些任务需要很长时间才能完成(从15分钟到1小时,甚至可能更久),所以选择一个LOCK_EXPIRE的设置似乎不太可靠:如果设置得太小,就会出现两个任务同时运行的情况;而如果设置得太大,万一某个celery进程因为某种原因崩溃了,我就得手动删除锁定的缓存键。
我想到的一个主意是可以使用两个不同的锁:一个是用fcnt.lockf创建的(适用于不同的celery工作进程),另一个是用threading.Lock()创建的(当任务在同一个celery进程中执行时)。不过,使用两个锁似乎有点过于复杂了。
所以,我的问题是:对于我的情况,最简单的解决方案是什么?不需要跨平台,只要支持Linux就可以。
1 个回答
2
只需要使用一个没有过期时间的锁,然后创建一个定期的“检查者”任务,这个任务会定期检查一切是否正常。也就是说,如果有其他任务意外停止了,它会解决锁的问题。另外,可以看看这里的内容。