作者:Twosssss | 来源:互联网 | 2023-02-10 14:14
我正在使用Python(2.7)和pymongo(3.3),我需要生成一个子进程来异步运行一个作业.不幸的是pymongo不像这里描述的那样是fork-safe (我需要在生成子进程之前与db进行交互).
我运行了一个实验subprocess.Popen
(使用shell
set to True
然后False
)和multiprocessing.Process
.据我所知,他们都分叉父进程来创建子进程,但只multiprocessing.Process
导致pymongo打印它已检测到分叉进程的警告.
我想知道这样做的pythonic方式是什么.似乎也许os.system
会为我做这件事,但subprocess
被描述为一个预定的替代品,os.system
所以我想知道我是否遗漏了一些东西.
1> Serge Balles..:
不是fork安全并不意味着你不能调用fork ...它只是意味着子进程不应该使用任何继承的PyMongo实例.使用时subprocess.Popen
,新分叉的子进程几乎立即调用exec
shell实例(shell = True)或所需的可执行文件(shell = False).因此从PyMongo的角度来看是安全的.
相反,当您调用multiprocessing.Process时,子项确实是父项的副本,并保留其PyMongo实例.因此,在该上下文中使用PyMongo是不安全的,并且正确发出了警告消息