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

gdRow

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

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_jobPython 2中的绑定方法(如)失效,请考虑一下。您正在跨越流程边界,并且在接收端没有对应的对象selfself.run_job在接收端应该绑定到什么对象

在Python 3中,酸洗self.run_job 还会酸洗self对象的副本这就是答案:SampleClass与之相对应对象self是在接收端由魔术创建的。清澈如泥。t的整个状态被腌制,包括t.lock这就是它“起作用”的原因。

请参阅此以获取更多实施细节:

为什么我可以将实例方法传递给multiprocessing.Process,而不是multiprocessing.Pool?

从长远来看,如果您坚持那些显然可以工作的事情,那么将蒙受最少的困扰:传递模块全局可调用对象(无论是实例方法还是本地函数),并显式传递multiprocessing数据对象(无论是实例LockQueuemanager.list,等等等等)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Python多处理:在进程之间共享数据

Python在多处理进程之间共享双端队列

Python在进程之间共享锁

在多处理进程之间共享大型只读的Numpy数组

如何在进程之间共享日期变量-多处理Python

Python:在生成的进程之间共享锁

Python多处理-进程之间的管道通信

为什么这里的多处理速度较慢?

正确使用进程之间共享的pthread互斥锁

使用python多处理在两个进程之间转移模块

Python多处理-是否可以在各个进程之间引入固定的时间延迟?

在Python中使用多处理模块时无法在进程之间互锁

Python多处理:避免通过进程之间的模块进行通信

在Python进程之间共享复杂的对象?

在python中的进程之间共享对象

为什么在分叉的进程之间共享文件描述符?

在进程之间共享条件变量和互斥锁:互斥锁必须先锁定吗?

Python多处理锁

Python多重处理:RuntimeError:“队列对象仅应通过继承在进程之间共享”

进程之间共享内存

为什么在线程之间切换比在进程之间切换和在它们之间共享数据要快?

python服务器中进程之间的共享列表

在python中的不同进程之间共享列表

如何在python的进程之间共享数据?

在 Python 中的多个进程之间共享存储对象的字典

在多个python进程之间共享RabbitMQ通道

在单独的进程之间共享内存中的复杂python对象

在Python中的进程之间共享许多队列

可以在Python进程之间共享set()吗?