在 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(无论是一个脚本还是多个脚本):
- 输入代码
- 启动
mongod
(与 code/in 后台的其余部分异步并让它侦听来自 Mongo 客户端的连接)(#TODO
)
- 创建一个Mongo客户端
- 通过所述客户端与我的数据库交互
- 终止 Mongo 守护程序(
#TODO
)
- 退出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()
-- 似乎正是我要找的。
我正在使用 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(无论是一个脚本还是多个脚本):
- 输入代码
- 启动
mongod
(与 code/in 后台的其余部分异步并让它侦听来自 Mongo 客户端的连接)(#TODO
) - 创建一个Mongo客户端
- 通过所述客户端与我的数据库交互
- 终止 Mongo 守护程序(
#TODO
) - 退出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()
-- 似乎正是我要找的。