为什么Celery没有干净地关闭

  • 本文关键字:Celery python celery
  • 更新时间 :
  • 英文 :


使用Ctlr-C键盘中断向Celery工作人员发出两次TERM信号(热关机和冷关机)后,Celery工作程序刚刚挂断。它没有消耗消息或执行任务(正如预期的那样),但也没有关闭。

我在Celery进程上运行了strace,看看幕后发生了什么。这是芹菜主进程 PID上的strace输出

strace -p 27867
Process 27867 attached - interrupt to quit
futex(0xb966a78, FUTEX_WAIT, 0, NULL

以下是我在子进程上执行strace时发现的内容:

strace -p 27874
Process 27874 attached - interrupt to quit
select(4, [3], NULL, NULL, {0, 562000}) = 0 (Timeout)
futex(0x871a808, FUTEX_WAKE, 1)         = 0
select(4, [3], NULL, NULL, {1, 0})      = 0 (Timeout)
futex(0x871a808, FUTEX_WAKE, 1)         = 0
......................................................

我知道我可以向进程发出KILL信号来清除它们。但我很想知道是什么真正阻止了这些进程的关闭,以及是否有可能对此采取措施

软件堆栈:Python 2.6.2,Celery 2.4.6,CentOS 5.0

更新:CPU使用率下降到几乎0%。这些任务相当占用CPU,因此这确认了当前没有任何任务处于活动状态。

来自文档:

例如,如果工人在考虑周到的时间后不停车由于任务处于无限循环中,因此可以使用KILL发出强制终止工作人员的信号,但要注意当前执行任务将丢失(除非任务具有acks_late选项集)。

同样来自谷歌集团:

celeryd将不会关闭,直到所有活动任务都已被处理,其中active表示已启动的任务(不是全部保留任务)。保留的消息将被释放在连接通道关闭后重新交付。这种情况会发生在活动任务返回之后。如果你没有--启用了时间限制的celeryd永远不会在关闭时杀死你的任务,即使它们需要几天才能完成。

相关内容

  • 没有找到相关文章