【发布时间】:2018-12-22 05:13:54
【问题描述】:
我正在使用本地(“社区”)版本的 MongoDB、Python 3 和 pymongo。
首先,我在单独的 shell 中手动启动 MongoDB 守护程序 (mongod),然后运行我的 Python 脚本。此脚本使用 pymongo 成功实例化 MongoDB 客户端 (mongo) 并与我的数据库交互。当我的脚本终止时,我会通过将kill 命令发送到它的PID 来手动终止守护进程。
虽然这一切都很好,但这个脚本的目标是尽可能地自动化。因此,我想通过脚本合并守护进程的启动和终止,但它必须是异步的,以免主代码无法运行。我尝试使用subprocess.Popen(),然后使用Thread 类,其守护程序属性设置为true——但当我在整个程序退出后调用ps 时,我仍然看到mongod 进程启动并运行。
下面是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 执行以下操作(无论是一个脚本还是多个):
- 输入代码
- 启动
mongod(异步到其余代码/在后台,让它监听来自 Mongo 客户端的连接)(#TODO) - 创建一个 Mongo 客户端
- 通过所述客户端与我的数据库交互
- 终止 Mongo 守护进程 (
#TODO) - 退出代码/终止程序
线程是正确的方法吗?如果是这样,我做错了什么?如果线程不是答案,您建议我改用什么方法?
【问题讨论】:
标签: python multithreading mongodb pymongo daemon