2013-06-18 28 views
2

我使用Celery 3.0.15和MongoDB 2.4.4副本集作为后端(pymongo版本2.5.1)。我也用同样的副本设置为主要应用的数据存储:MongoReplicaSetClient不会在芹菜工人重新连接

CELERY_CONFIG = { 
    'BROKER_URL': 'mongodb://localhost:27017,localhost:27018,localhost:27019/', 
    'BROKER_TRANSPORT_OPTIONS': { 
     'replicaSet': 'test' 
    } 
} 

... 

conn = MongoReplicaSetClient(
    'localhost:27017,localhost:27018,localhost:27019', 
    replicaSet='test' 
) 

我就可以开始一些工人,并使用此conn实例来从代码中访问内部芹菜任务数据库。

如果mongo初级关闭并重新选举,芹菜工会自动重新连接到新配置。但是,无论我做了多少次重试,而且无论等待多长时间,conn的所有后续查询都会返回AutoReconnect异常。

为代理和主数据库分离副本集不能解决问题:工作人员仍能正常重新连接,但我无法从使用相同MongoReplicaSetClient的任务访问mongo。

UPDATE

手动调用AutoReconnectconn.refresh()解决了这个问题。似乎MonitorThread在这种情况下无法正常工作。

回答

4

原因是芹菜开始工人的方式。默认情况下,在3.0.15中,它使用fork(),它复制父进程的状态,但使MonitorThread死机。解决方法是使用CELERYD_FORCE_EXECV选项,该选项强制芹菜以execv()运行工作人员,并使监视器再次活跃并开心。