我试图在进程之间共享一个锁。我知道共享锁的方法是将其作为参数传递给目标函数。但是我发现,即使下面的方法也有效。我无法理解进程共享此锁的方式。谁能解释一下?
import multiprocessing as mp
import time
class SampleClass:
def __init__(self):
self.lock = mp.Lock()
self.jobs = []
self.total_jobs = 10
def test_run(self):
for i in range(self.total_jobs):
p = mp.Process(target=self.run_job, args=(i,))
p.start()
self.jobs.append(p)
for p in self.jobs:
p.join()
def run_job(self, i):
with self.lock:
print('Sleeping in process {}'.format(i))
time.sleep(5)
if __name__ == '__main__':
t = SampleClass()
t.test_run()
在Windows(您说过您正在使用)上,这些事情总是会简化为有关如何multiprocessing
玩的细节pickle
,因为Windows上所有Python数据跨越进程的边界都是通过在发送端进行酸洗(在接收端进行酸洗)来实现的。 。
我最好的建议是避免做任何会引起此类问题的事情;-)例如,您显示的代码在Windows下使用Python 2时会崩溃,而在Python 3下使用multiprocessing.Pool
方法而不是时也会崩溃multiprocessing.Process
。
这不仅是锁,还只是尝试使self.run_job
Python 2中的绑定方法(如)失效,请考虑一下。您正在跨越流程边界,并且在接收端没有对应的对象self
。self.run_job
在接收端应该绑定到什么对象?
在Python 3中,酸洗self.run_job
还会酸洗self
对象的副本。这就是答案:SampleClass
与之相对应的对象self
是在接收端由魔术创建的。清澈如泥。t
的整个状态被腌制,包括t.lock
。这就是它“起作用”的原因。
请参阅此以获取更多实施细节:
为什么我可以将实例方法传递给multiprocessing.Process,而不是multiprocessing.Pool?
从长远来看,如果您坚持那些显然可以工作的事情,那么将蒙受最少的困扰:传递模块全局可调用对象(无论是实例方法还是本地函数),并显式传递multiprocessing
数据对象(无论是实例Lock
,Queue
,manager.list
,等等等等)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句