1

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

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

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

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

我会收到一个连接错误,指出它无法连接:

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

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

等待 mongod 实例启动的最佳方法是什么?我可以使用一个while循环来尝试连接,但这似乎非常草率。如果有人有任何建议,我很想听听他们的意见。

4

1 回答 1

2

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

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

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

于 2013-06-11T19:29:14.793 回答