为什么芹菜不能干净地关闭?

rub*_*eet 11 python celery

在使用Ctlr-C键盘中断向Celery工作人员发出TERM信号两次(暖关机和冷关机)后,Celery工作人员才挂断电话.它不消耗消息或执行任务(如预期的那样),但它也没有关闭.

我跑strace了Celery进程,看看幕后发生了什么.这是straceCelery主过程的PID输出

strace -p 27867
Process 27867 attached - interrupt to quit
futex(0xb966a78, FUTEX_WAIT, 0, NULL
Run Code Online (Sandbox Code Playgroud)

以下是我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
......................................................
Run Code Online (Sandbox Code Playgroud)

我知道我可以向进程发出一个KILL信号来摆脱它们.但是我很想知道究竟是什么阻止了这些进程被关闭,以及是否有可能对它做些什么.

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

更新:CPU使用率降至几乎0%.这些任务非常占用CPU,因此确认当前没有任何任务处于活动状态.

hym*_*oth 5

来自文档

\n\n
\n

如果工作线程在适当的时间后\xe2\x80\x99t关闭,例如\n由于任务陷入无限循环,则可以使用 KILL\n 信号强制终止工作线程,但请注意,当前\n正在执行的任务将会丢失(除非任务设置了 acks_late\n 选项)。

\n
\n\n

也来自谷歌群组

\n\n
\n

在处理完所有活动任务之前,celeryd 不会关闭,其中“活动”表示已启动的任务(并非所有保留任务)。连接通道关闭后,保留的消息将被释放并重新传送。这会在活动任务返回后发生。如果你没有启用 --time-limit ,celeryd 永远不会在关闭时终止你的任务,即使它们需要几天才能完成。

\n
\n

  • 没有活动任务。发出停止信号时正在运行的任务已完成。队列长度保持不变。没有任何内容输出到日志中。但进程仍然没有终止。正如我所说,我*可以*发出 KILL 并摆脱它们。但这并不是一个有效的解决方案。为了可靠地使用该软件,我需要能够自动停止(和启动)它,而无需或很少手动干预。 (2认同)