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