我有一个特定的工作,似乎经常挂我的芹菜工人。我使用rabbitmq作为经纪人。我试了几件事情要解决这个问题,但没有成功:芹菜队挂
-
自动配置功能
- 工人,让那些挂有足够的时间来完成执行
- 设置一个全球性的超时
所以我对于导致这个问题的原因有一点点缺点,以及我如何解决这个问题。任何人都可以给我任何指针?有问题的任务是简单地插入一条记录到数据库(在这种情况下是MongoDB)。
更新:我已经添加了CELERYD_FORCE_EXECV。我们会看看是否修复它。 更新2:不!
我有一个特定的工作,似乎经常挂我的芹菜工人。我使用rabbitmq作为经纪人。我试了几件事情要解决这个问题,但没有成功:芹菜队挂
所以我对于导致这个问题的原因有一点点缺点,以及我如何解决这个问题。任何人都可以给我任何指针?有问题的任务是简单地插入一条记录到数据库(在这种情况下是MongoDB)。
更新:我已经添加了CELERYD_FORCE_EXECV。我们会看看是否修复它。 更新2:不!
使子进程挂起的特定作业通常是从未完成的IO的症状,例如, Web请求或套接字读取没有超时。
大多数图书馆支持设置超时,但如果没有,你可以随时使用socket.setdefaulttimeout
:
import socket
@task
def http_get(url, timeout=1.0, retry_after=3.0, max_retries=None):
prev_timeout = socket.getdefaulttimeout()
socket.setdefaulttimeout(timeout)
try:
return requests.get(url)
except socket.timeout:
raise http_get.retry(exc=exc, countdown=retry_after, max_retries=max_retries)
finally:
socket.setdefaulttimeout(prev_timeout)
你最有可能击中芹菜/海带(见https://github.com/celery/celery/issues/3712),只有得到了最近固定一个无限循环的bug 。它尚未发布。有关详细信息,请参阅提交https://github.com/celery/kombu/pull/760。如果您的安装无法使用回购版本,则解决方法是现在切换到Redis或设置CELERY_WORKER_PREFETCH_MULTIPLIER=0
和-P solo
。