我正在使用 Python (2.7) 和 pymongo (3.3),我需要生成一个子进程来异步运行作业。不幸的是,pymongo 不是描述的 fork 安全的 here (并且我需要在生成子进程之前与数据库进行交互)。
我使用 subprocess.Popen 进行了实验(shell 设置为 True 然后是 False)并且多进程处理。据我所知,他们都 fork 父进程来创建子进程,但只有 multiprocessing.Process 会导致 pymongo 打印它的警告,表明它已检测到 fork 进程。
我想知道这样做的 pythonic 方式是什么。似乎 os.system 会为我做这件事,但是 subprocess 被描述为 os.system 的预期替代品,所以我想知道我是否缺少一些东西。
请您参考如下方法:
非 fork 安全并不意味着你不能调用 fork...它只是意味着子进程不应该使用任何继承的 PyMongo 实例。当您使用 subprocess.Popen 时,新 fork 的子进程几乎立即调用 exec 以替换为 shell 实例 (shell = True) 或所需的可执行文件 (shell = False) .因此从 PyMongo 的角度来看它是安全的。
相反,当您调用 multiprocessing.Process 时,子进程确实是父进程的副本,并保留其 PyMongo 实例。因此在该上下文中使用 PyMongo 是不安全的,并且正确发出了警告消息
