gpt4 book ai didi

Python:为什么这里的进程之间共享多进程锁?

转载 作者:行者123 更新时间:2023-12-04 23:14:55 25 4
gpt4 key购买 nike

我正在尝试在进程之间共享锁。我知道共享锁的方法是将其作为参数传递给目标函数。但是我发现即使下面的方法也有效。我无法理解进程共享此锁的方式。谁能解释一下?

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 数据都是通过在发送端进行酸洗(在接收端取消酸洗)来实现的。

我最好的建议是避免一开始就提出这样的问题 ;-) 例如,您展示的代码在 Python 2 下的 Windows 上会崩溃,如果您使用 multiprocessing.Pool 也会在 Python 3 下崩溃。方法而不是 multiprocessing.Process .

这不仅仅是锁,只是试图腌制一个绑定(bind)方法(如 self.run_job )在 Python 2 中爆炸。想想看。您正在跨越进程边界,并且没有对应于 self 的对象在接收端。对象是什么self.run_job应该在接收端绑定(bind)?

在 Python 3 中,酸洗 self.run_job还腌制一份self目的。这就是答案:SampleClass对应于 self 的对象是由接收端的魔法创建的。清如泥。 t的整个状态都是腌制的,包括 t.lock .这就是它“起作用”的原因。

有关更多实现细节,请参阅此:

Why can I pass an instance method to multiprocessing.Process, but not a multiprocessing.Pool?

从长远来看,如果你坚持那些明显打算工作的东西,你将遭受最少的谜团:传递模块全局可调用对象(既不是实例方法也不是局部函数),并显式传递 multiprocessing数据对象(LockQueuemanager.list 等的实例)。

关于Python:为什么这里的进程之间共享多进程锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45023569/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com