Mongodb MongoReplicateSetClient在芹菜工人中未重新连接

Mongodb MongoReplicateSetClient在芹菜工人中未重新连接,mongodb,celery,pymongo,Mongodb,Celery,Pymongo,我使用芹菜3.0.15和MongoDB 2.4.4副本集作为后端(pymongo版本2.5.1)。我还将同一副本集用作主应用程序数据存储: CELERY_CONFIG = { 'BROKER_URL': 'mongodb://localhost:27017,localhost:27018,localhost:27019/', 'BROKER_TRANSPORT_OPTIONS': { 'replicaSet': 'test' } } ... conn

我使用芹菜3.0.15和MongoDB 2.4.4副本集作为后端(pymongo版本2.5.1)。我还将同一副本集用作主应用程序数据存储:

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'
)
我可以启动一些worker并使用这个
conn
实例从芹菜任务中的代码访问数据库

如果mongo primary关闭并重新当选,芹菜工人将自动重新连接到新配置。但是所有后续的
conn
查询都返回
AutoReconnect
异常,无论我重试多少次,也不管我等待多长时间

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

更新


AutoReconnect
之后手动调用
conn.refresh()。在这种情况下,
MonitorThread
似乎无法正常工作。

原因是芹菜启动其工作程序的方式。默认情况下,在3.0.15中,它使用
fork()
复制父进程的状态,但使
MonitorThread
失效。解决方案是使用
CELERYD\u FORCE\u EXECV
选项,该选项强制celery使用
EXECV()
运行工作人员,并使监视器再次激活和快乐