芹菜:一个工作进程阻塞了其他工作进程的执行?分享什么



我在芹菜工作进程之间经历了一种奇怪的交互,我认为它们是独立的。你能提出一个可能的原因吗?

我有一个具有多个工作进程的芹菜工作进程:

 PPID  PID
 5892  5919   _ /bin/bash -c sleep 10 && python manage.py makemigrations --noinput; python manage.py migrate --noinput; python manage.py initservice; celery -B -A workflows --workdir=/srv/workflows -l info --autoscale=2,30 -n UNIVERSE_NODE -Q workflows worker
 5919  6168        _ /usr/bin/python /usr/local/bin/celery -B -A workflows --workdir=/srv/workflows -l info --autoscale=2,30 -n UNIVERSE_NODE -Q workflows worker
 6168  6180           _ /usr/bin/python /usr/local/bin/celery -B -A workflows --workdir=/srv/workflows -l info --autoscale=2,30 -n UNIVERSE_NODE -Q workflows worker
 6168  6185           _ /usr/bin/python /usr/local/bin/celery -B -A workflows --workdir=/srv/workflows -l info --autoscale=2,30 -n UNIVERSE_NODE -Q workflows worker
 6168  6186           _ /usr/bin/python /usr/local/bin/celery -B -A workflows --workdir=/srv/workflows -l info --autoscale=2,30 -n UNIVERSE_NODE -Q workflows worker
 6168  6187           _ /usr/bin/python /usr/local/bin/celery -B -A workflows --workdir=/srv/workflows -l info --autoscale=2,30 -n UNIVERSE_NODE -Q workflows worker
 6168  6188           _ /usr/bin/python /usr/local/bin/celery -B -A workflows --workdir=/srv/workflows -l info --autoscale=2,30 -n UNIVERSE_NODE -Q workflows worker
 ...   ...

有时候,一个工作进程卡住了,然后…它以某种方式阻塞了所有其他工作进程。当这个进程停止时,其他工作进程继续执行。

根据设计,除了worker (PID为6168的父进程)和消息队列+结果后端之外,worker进程之间不应该有共享状态。但不知何故,总有一些。

你能指出造成这种死锁的可能原因吗?

我使用最新的芹菜3.1,RabbitMQ作为消息队列和MongoDB作为结果后端,默认的早期返回和(显然,并发的多处理模式)。

找到此行为的原因:http://docs.celeryproject.org/en/latest/whatsnew-3.1.html#caveats。对于长时间运行的进程,预取策略可能会使一个进程阻塞其他进程。

为了防止这种情况,使用-Ofair标志:

$ celery -A proj worker -l info -Ofair

最新更新