在 Python 中管理(即正确终止)MongoDB 守护程序的最可接受的方法是什么?

What is the most acceptable way to manage (i.e. properly terminate) the MongoDB daemon in Python?

我正在使用 MongoDB、Python 3 和 pymongo 的本地 ("community") 版本。

首先,我一直在单独的 shell 中手动启动 MongoDB 守护程序 (mongod),然后 运行 我的 Python 脚本。此脚本使用 pymongo 成功实例化 MongoDB 客户端 (mongo) 并与我的数据库交互。当我的脚本终止时,我会通过向其 PID 发送 kill 命令来手动终止守护进程。

虽然这一切都很好,但这个脚本的目标是尽可能自动化。因此,我想通过脚本合并守护进程的启动和终止,但它必须是异步的,以免保留 运行 中的主要代码。我尝试使用 subprocess.Popen(),然后使用 Thread class 并将守护程序属性设置为 true - 但我仍然看到 mongod 进程和 运行 当我在整个程序退出后调用 ps 时。

下面是 Thread class:

class MongoDaemonThread(object):
    def __init__(self):
        thread = threading.Thread(target=self.run, args=())
        thread.daemon = True
        thread.start()

    def run(self):
        mongo_daemon = subprocess.Popen('/Users/<me>/.mongodb/bin/mongod')
        return mongo_daemon

这是我与数据库交互的函数:

def db_write(report_list, args):
    # ...
    client = MongoClient()
    db = client.cbf
    # ...
    reports = db.reports
    for report in report_list:
        report_id = reports.insert_one(report).inserted_id
    # ...

我想要做的是以下内容,贯穿 Python(无论是一个脚本还是多个脚本):

  1. 输入代码
  2. 启动 mongod(与 code/in 后台的其余部分异步并让它侦听来自 Mongo 客户端的连接)(#TODO
  3. 创建一个Mongo客户端
  4. 通过所述客户端与我的数据库交互
  5. 终止 Mongo 守护程序(#TODO
  6. 退出code/terminate程序

线程是执行此操作的正确方法吗?如果是这样,我做错了什么?如果线程不是答案,您建议我改用什么方法?

首先,你不应该从python开始mongod进程。 mongod 应该从 shell 开始和停止。因为数据库必须始终为连接做好准备。但如果你真的想从 python 开始,你仍然可以使用:

from subprocess import call
call(["mongod","&"])

开始 mongod 进程。

要结束进程:

from subprocess import call
call(["pkill", "mongod","&"])

This answer -- 使用 p = Popen() 然后 p.terminate() -- 似乎正是我要找的。