为什么Python多进程管理器会产生线程锁?

3
>>> import multiprocessing
>>> multiprocessing.Manager().Lock()
<thread.lock object at 0x7f64f7736290>
>>> type(multiprocessing.Lock())
<class 'multiprocessing.synchronize.Lock'>

为什么管理器生成的对象是一个 thread.lock 而不是从 multiprocessing 对象期望的 multiprocessing.synchronize.Lock 呢?

托管对象始终是代理。我看到multiprocessing.Lockthreading.Lock之间可能存在重大差异。我猜你通常会使用multiprocessing.Lock(),除非你绝对需要一个threading.Lock()对象,在这种情况下,管理器会确保它在进程间同步。 - Martijn Pieters
无论如何,你为什么期望经理返回一个multiprocessing.Lock对象?你不需要管理该对象,它已经是多进程感知的。 - Martijn Pieters
我认为你已经给了我答案。经理的目标实际上是代理非多进程感知对象。 - azmeuk
2个回答

3
管理对象始终是代理对象;管理器的目标是使不支持多进程的对象变得支持多进程。
对于 multiprocessing.Lock() 对象来说,这样做是没有意义的;它们使用信号量实现,并且在没有任何帮助的情况下完全支持多进程。
另一方面,threading.Lock 不支持多进程;threading.Lock() 对象与 multiprocessing.Lock() 之间存在一些差异;例如,后者在获取锁时支持超时。

0

这绝对不是预期的,因为文档清楚地说明了Lock()

创建一个共享的threading.Lock对象并返回其代理。

至于为什么它返回一个线程锁而不是一个多进程对象,这是另一回事,我不幸无法回答。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接