Python3多处理池在访问锁时无限调用初始值设定项

Python3多处理池在访问锁时无限调用初始值设定项,python,multiprocessing,locking,Python,Multiprocessing,Locking,我想在子进程中使用Lock来处理文件。当我在初始值设定项中访问Lock时,Pool对初始值设定项进行无限递归调用 from multiprocessing import Lock, get_context class MyClass(object): @classmethod def run_mp(cls, jobs): context = get_context('spawn') w_lock = Lock() with c

我想在子进程中使用
Lock
来处理文件。当我在初始值设定项中访问
Lock
时,
Pool
对初始值设定项进行无限递归调用

from multiprocessing import Lock, get_context


class MyClass(object):

    @classmethod
    def run_mp(cls, jobs):
        context = get_context('spawn')
        w_lock = Lock()
        with context.Pool(1, initializer=cls._mp_init, initargs=(w_lock, )) as pool:
            res = pool.map(cls._execute_job, jobs)
            pool.close()

    @classmethod
    def _mp_init(cls, w_lock):
        # global weights_lock
        # weights_lock = w_lock
        print('weights lock')
        print(w_lock)  # this line causes infinite calls to this method

    @classmethod
    def _execute_job(cls, job):
        pass


if __name__ == '__main__':
    jobs = [1]
    mc = MyClass()
    mc.run_mp(jobs)
预期产出

我在本地机器上获得了预期的输出—mac_os,python3.7

weights lock
<Lock(owner=unknown)>
如果我在
\u init\u mp
方法中注释掉
print(w_lock)
,那么输出仍然是预期的

weight lock
所以基本上,当我尝试访问
w\u lock
时,它会进入一个无限递归调用
\u init\u mp

我试过在不同的glcoud实例上以相同的行为运行它


我无法理解为什么在linux上访问锁会导致这样的行为。有什么解释吗?

使用
fork
方法时不会发生这种行为,但使用
spawn
forkserver
时,锁需要具有相同的上下文,因此需要
w_lock=context.lock()
。作为旁注,删除
pool.close()
,这就是pool的上下文管理器已经在为您做的事情。就是这样!谢谢我仍然不明白为什么它在MacOs上运行良好,而不是在Linux上。上下文在两者之间的工作方式是否不同?当您在Python 3.8+上时,macOS已经使用“spawn”作为默认值,这样您就不会尝试混合使用两种不同的启动方法,比如在Linux上尝试这种方法,其中“fork”仍然是默认值。啊,我明白了。这就是答案。谢谢
weight lock