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

2024-04-19 11:29:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用的是MongoDB、python3和pymongo的本地(“社区”)版本。你知道吗

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

虽然这一切都很好,但这个脚本的目标是尽可能地自动化。因此,我希望通过脚本合并守护进程的启动和终止,但它必须是异步的,这样就不会阻止主代码运行。我尝试使用subprocess.Popen(),然后使用一个Thread类,daemon属性设置为true——但是我仍然看到在整个程序退出后调用psmongod进程启动并运行。你知道吗

下面是Thread类:

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(与其他代码/在后台异步,并让它侦听来自Mongo客户机的连接)(#TODO
  3. 创建Mongo客户端
  4. 通过所述客户端与我的数据库接口
  5. 终止Mongo守护程序(#TODO
  6. 退出代码/终止程序

线程是正确的方法吗?如果是,我做错了什么?如果线程不是答案,你建议我用什么方法来代替?你知道吗


Tags: self程序report脚本数据库db进程mongo
2条回答

This answer使用p = Popen()然后p.terminate()似乎正是我想要的。你知道吗

首先,您不应该从python启动mongod进程。mongod应该从shell启动和停止。因为数据库必须随时准备好连接。但是,如果您真的想从python中执行此操作,您仍然可以使用:

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

启动mongod进程。你知道吗

要结束此过程:

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

相关问题 更多 >