我有一个python celery-redis队列处理一次上传和下载值得一次演出和大量演出的数据。
很少有上传内容需要花费几个小时的时间。但是,一旦完成了这样的任务,我就目睹了这种奇怪的芹菜行为:芹菜调度程序通过将其再次发送给工作人员来重新运行刚刚完成的任务(我正在运行一个工作人员),并且它在同一时间发生了2次任务!
有人可以帮助我知道为什么会发生这种情况以及如何预防吗?
这些任务肯定干净地完成了,没有错误报告,因为这些任务运行时间非常长。
我最近遇到了这个问题,最终发现由于任务预取和任务超出 可见性超时的结合,任务正在多次运行 。任务将在执行之前被确认(除非您设置ACKS_LATE = True),并且默认情况下每个进程会预取4个任务。第一个任务将在执行之前得到确认,但是如果执行需要一个多小时,则其他预提取的任务将被交付给另一个工作程序,在该工作程序中,它会被执行另外的时间(或者在您的情况下,由同一人执行另外的时间)工人)。
您可以通过将可见性超时时间增加到比任务的最长运行时间更长的时间来解决:
BROKER_TRANSPORT_OPTIONS = {'visibility_timeout': 3600*10} # 10 hours
您还可以设置PREFETCH_MULTIPLIER=1为禁用预取,以便长时间运行的任务不会阻止其他任务被确认。
PREFETCH_MULTIPLIER=1