如何/最佳方式等待Mongod实例在继续之前启动

时间:2013-06-10 19:25:34

标签: python mongodb subprocess pymongo

我正在尝试使用以下代码在Python中启动Mongod实例(省略了一些细节):

subprocess.call("mongod --fork --dbpath /asdf --port 12345", shell=True)

我的印象是子进程在返回之前等待进程启动,尽管似乎并非如此。例如,如果我之后调用以下内容:

conn = pymongo.MongoClient("localhost", 12345)

我将收到一条连接错误,指出它无法连接:

pymongo.errors.ConnectionFailure: could not connect to localhost:12345: [Errno 111] Connection refused

但是,如果我从终端内启动python,我可以毫无问题地连接。另外,如果我在子进程调用之后立即发出sleep命令,我可以连接,尽管这会导致各种潜在的竞争条件。

等待mongod实例启动的最佳方法是什么?我可以使用while循环尝试连接,但这看起来非常邋。如果有人有任何建议,我很乐意听到。

1 个答案:

答案 0 :(得分:2)

子进程在subprocess.call返回时启动,但它可能尚未开始侦听套接字。我们必须在PyMongo的自我测试中解决这个问题,所以我们编写了一个wait_for方法:

https://github.com/mongodb/mongo-python-driver/blob/master/test/high_availability/ha_tools.py#L72

要点是,尝试连接到mongod的端口。如果还没有收听,请继续尝试。如果你尝试了太多次,那就错了(磁盘已满,命令行参数错误等)。