Python Celery - 通过pid查找任务

时间:2013-01-21 17:26:12

标签: python celery amqp

一个非常直截了当的问题,也许 - 我经常看到在我的系统上运行的芹菜任务流程,当我使用celery.task.control.inspect()的{​​{1}}方法时,我无法找到该流程。这个过程通常会运行几个小时,我担心它会变成某种僵尸。通常它也会占用大量内存。

有没有办法通过linux pid查找任务?芹菜或AMPQ结果后端会保存吗?

如果没有,任何其他方式来确定哪个特定任务是围绕着记忆的那个?

----更新:

active()告诉我在特定的盒子上没有运行任务但是盒子的内存已经完全使用时,我该怎么办?htop显示这些工作池线程是使用它的人,但同时使用0%的CPU?如果事实证明这与我目前的机架空间设置的某些怪癖有关,没人能回答,我仍然会接受Loren的。

感谢〜

1 个答案:

答案 0 :(得分:4)

我要假设“任务”是指“工人”。这个问题在其他方面毫无意义。

对于某些上下文,了解Celery工作池的进程层次结构非常重要。工作池是一组共享相同配置的工作进程(或线程)(同一组队列的进程消息等)。每个池都有一个管理池的父进程。这个过程控制分叉的童工数量,并负责在孩子死亡时分叉替换孩子。父进程是绑定到AMQP的唯一进程,子进程通过IPC从父进程接收和处理任务。父进程本身并不实际处理(运行)任何任务。

此外,对于您的问题的答案,父进程是负责响应您的Celery检查广播的进程,并且在池中列为工作者的PID仅是童工。不包括父PID。

如果您使用--pidfile命令行参数启动Celery守护程序,该文件将包含父进程的PID,您应该能够将该PID与您引用的进程交叉引用确定它是否实际上是池父进程。如果您正在使用Celery multi来启动多个实例(多个工作池),那么默认情况下,PID文件应位于您调用Celery multi的目录中。如果您没有使用这些方法中的任何一种来启动Celery,请尝试使用其中一种来验证该进程不是僵尸,实际上只是父进程。