我正在尝试使用以下代码在 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 循环尝试连接,但这看起来非常草率。如果有人有任何建议,我很乐意听听。
最佳答案
子进程在 subprocess.call
返回时已启动,但它可能尚未开始监听套接字。我们要在PyMongo的自测中解决这个问题,所以我们写了一个wait_for
方法:
https://github.com/mongodb/mongo-python-driver/blob/master/test/high_availability/ha_tools.py#L72
要点是,尝试连接到 mongod
的端口。如果它还没有在听,请继续尝试。如果您尝试了太多次,就会出现问题(磁盘已满、命令行参数错误等)。
关于python - 在继续之前如何/最好的方式等待 Mongod 实例启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17031268/