Celery
Solution for hanging workers
两种解决方案:
1. 假如是因为现在worker的并发是prefork(多过程),可能是死锁造成的!
所以可以用 CELERYD_FORCE = True ,这样可以有效防止死锁。即使不是这个原因造成的,也尽量加上。
注意:这种处理方法是4.0后版本不支持,使用时需要检查版本,也可以采用以下方法
2. 第二种解决方案适用于大多数过程hanging可以使用time_limit参数,设置任务执行超时间,当超过此时间时,先生成新的过程,并通过信号hanging杀死过程。
另外,如果在配置中使用,act_late需要配合的参数broker_transport_options = {'visiblity_timeout': 10 *60 }使用,这样,在task超时后,如果还没有超时间ack, 它将被发送到其他地方worker去执行。如果没设置ack_late,代表不关心执行结果,不需要设置此参数
一个非常有用的博客链接:http://blog.csdn.net/woshiaotian/article/details/36422781