python - 在继续之前如何/最好的方式等待 Mongod 实例启动

标签 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 循环尝试连接,但这看起来非常草率。如果有人有任何建议,我很乐意听听。

最佳答案

子进程在 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/

相关文章:

javascript - 了解 node.js 异步性 - for 循环与嵌套回调

python - 一个大进程或多个小进程的内存使用情况更好吗?

python - python 中的 a,b = b,a 与 C++ 中的 std::swap()

python - Pycassa col_fam.get_indexed_slices(clause) 有什么问题

python - 生成器作为函数参数

Python:如何防止子进程接收 CTRL-C/Control-C/SIGINT

python - 将 Subprocess.call 的输出存储在字符串中

python - 针对 EPD Canopy : no lib/config directory 编译 vim

java - 使用 Tasklet 在 Spring Batch 中或在 CompositeItemWriter 中创建逻辑?

MongoDB 与 $addToSet 相对