在Python中生成一个进程而不分叉

2024-10-01 15:45:55 发布

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

我正在使用Python(2.7)和pymongo(3.3),我需要生成一个子进程来异步运行作业。不幸的是,pymongo并不是如here所述的fork-safe(我需要在生成子进程之前与db交互)。在

我用subprocess.Popen(先将shell设置为True,然后False)和{}进行了一个实验。据我所知,它们都派生父进程以创建子进程,但只有multiprocessing.Process使pymongo打印出它检测到分叉进程的警告。在

我想知道Python是怎么做的。似乎os.system会帮我做这件事,但是{}被描述为是{}的替代品,所以我想知道我是否遗漏了什么。在


Tags: falsetruedbhere进程作业forkshell
3条回答

不是fork safe并不意味着你不能调用fork。。。这只是意味着子进程不应该使用任何继承的PyMongo实例。当您使用subprocess.Popen时,新派生的子级几乎立即调用exec,以替换为shell实例(shell=True)或所需的可执行文件(shell=False)。所以从PyMongo的角度来看,它是安全的。在

当你打电话的时候多处理过程,子对象确实是父对象的副本,并保留其PyMongo实例。因此,在该上下文中使用PyMongo是不安全的,并且警告消息是正确发出的

如果您能够迁移到python3.4或更高版本,那么可以在使用pymongo之前,将^{} start method设置为'forkserver'。它会立即分叉一个fork服务器进程,并且以后使用multiprocessing派生该fork服务器,而不是主进程。因此,一旦设置了fork服务器,主进程就可以使用pymongo,fork服务器不会使用它,所以重新定位不会有问题。在

遗憾的是,start方法只在3.4中添加,所以它不是2.7的选项,但是如果其他人有这个问题,它可能对他们有用。在

我想您误解了;因为PyMongo的文档警告您单个MongoClient不是fork-safe,所以您将其解释为PyMongo禁止整个程序创建子进程。在

任何单个MongoClient都不是fork安全的,这意味着您不能在fork之前创建它,也不能在fork之后使用相同的MongoClient对象。在程序中使用PyMongo,或者在fork之前使用一个MongoClient,在fork之后使用另一个MongoClient都是安全的。在

这就是为什么subprocess.Popen是可以的:先分叉,然后执行(在子进程中用另一个程序替换程序),因此以后不可能在子进程中使用相同的MongoClient。在

引用PyMongo FAQ

On Unix systems the multiprocessing module spawns processes using fork(). Care must be taken when using instances of MongoClient with fork(). Specifically, instances of MongoClient must not be copied from a parent process to a child process. Instead, the parent process and each child process must create their own instances of MongoClient. For example:

# Each process creates its own instance of MongoClient.
def func():
    db = pymongo.MongoClient().mydb
    # Do something with db.

proc = multiprocessing.Process(target=func)
proc.start()

Never do this:

^{pr2}$

Instances of MongoClient copied from the parent process have a high probability of deadlock in the child process due to inherent incompatibilities between fork(), threads, and locks. PyMongo will attempt to issue a warning if there is a chance of this deadlock occurring.

相关问题 更多 >

    热门问题