我使用Celery / RabbitMQ与我的django应用程序执行异步任务。我刚刚开始与Celery合作。
执行任务后,一旦启动工作人员,一切都能正常运行。
问题是任务执行会在稍后停止。几个小时后,一天或有时几天。我意识到只有完成任务执行不完整的后果。然后我重新启动celery并执行所有挂起的任务,一切都恢复正常。
我的问题是:
我的筹码: Django 1.4.8 芹菜3.1.16 的RabbitMQ Supervisord
谢谢, 安迪
答案 0 :(得分:10)
(1)如果您的芹菜工作者有时会遇到困难,您可以使用strace & lsof
找出卡住的系统调用。
例如:
$ strace -p 10268 -s 10000
Process 10268 attached - interrupt to quit
recvfrom(5,
10268是芹菜工人的pid,recvfrom(5
表示工人停止从文件描述符接收数据。
然后,您可以使用lsof
查看此工作进程中的5
。
lsof -p 10268
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
......
celery 10268 root 5u IPv4 828871825 0t0 TCP 172.16.201.40:36162->10.13.244.205:wap-wsp (ESTABLISHED)
......
它表示工作人员陷入了tcp连接(您可以在5u
列中看到FD
)。
某些python软件包如requests
阻止等待来自对等方的数据,这可能导致芹菜工作者挂起,如果您使用requests
,请确保设置timeout
参数。< / p>
(2)您可以在RabbitMQ中监控您的芹菜任务队列大小,如果它在很长一段时间内持续增加,可能是芹菜工人正在罢工。
您是否看过此页:
https://www.caktusgroup.com/blog/2013/10/30/using-strace-debug-stuck-celery-tasks/