首页 > 解决方案 > forkserver 不在子进程中重用

问题描述

multiprocessing.forkserver.Forkserver暴露ensure_running方法。此方法的文档字符串说明以下内容:

def ensure_running(self):
    '''Make sure that a fork server is running.

    This can be called from any process.  Note that usually a child
    process will just reuse the forkserver started by its parent, so
    ensure_running() will do nothing.

链接到源:https ://github.com/python/cpython/blob/master/Lib/multiprocessing/forkserver.py#L105

但是,以下代码片段似乎没有显示该行为:

from multiprocessing import set_start_method, forkserver
from multiprocessing.context import Process
import os


def child2():
    print(f"in child2: pid={os.getpid()}, ppid={os.getppid()}, forkserver.pid={forkserver._forkserver._forkserver_pid}")


def child1():
    p = Process(target=child2)
    p.start()
    p.join()
    print(f"in child1: pid={os.getpid()}, ppid={os.getppid()}, forkserver.pid={forkserver._forkserver._forkserver_pid}")


def run():
    p = Process(target=child1)
    p.start()
    p.join()
    print(f"in run: pid={os.getpid()}, ppid={os.getppid()}, forkserver.pid={forkserver._forkserver._forkserver_pid}")


if __name__ == "__main__":
    set_start_method("forkserver")
    run()

输出以下内容:

in child2: pid=4378, ppid=4377, forkserver.pid=None
in child1: pid=4375, ppid=4374, forkserver.pid=4377
in run: pid=4372, ppid=2742, forkserver.pid=4374

主进程 (pid= 4372) 产生一个 forkserver (pid= 4374)。这个 forkserver forkschild1生成了它自己的 forkserver,其 pid 为4377.

我错过了什么吗?我希望child1's forkserver 与 main 的 forkserver 具有相同的 pid。

标签: pythonmultiprocessing

解决方案


推荐阅读