2012-09-16 70 views
1

我有一个特定的工作,似乎经常挂我的芹菜工人。我使用rabbitmq作为经纪人。我试了几件事情要解决这个问题,但没有成功:芹菜队挂

    自动配置功能
  • 工人,让那些挂有足够的时间来完成执行
  • 设置一个全球性的超时

所以我对于导致这个问题的原因有一点点缺点,以及我如何解决这个问题。任何人都可以给我任何指针?有问题的任务是简单地插入一条记录到数据库(在这种情况下是MongoDB)。

更新:我已经添加了CELERYD_FORCE_EXECV。我们会看看是否修复它。 更新2:不!

回答

1

使子进程挂起的特定作业通常是从未完成的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)