python3中multiprocessing.Lock的共享字典

时间:2019-02-02 11:57:20

标签: python-multiprocessing

在python3中是否可以共享Locks的字典?我需要多个锁,因为我想保护共享资源的指示。每个资源都有一个锁:

manager = multiprocessing.Manager()

locks = manager.dict({key : manager.Lock() for key in range(100)})
shared_resource = manager.dict({key : SomeClass() for key in range(100)})

# later in a multi-processed function
def foo(key):
  # ...
  locks[key].acquire()
  shared_resource[key] = ...
  locks[key].release()
  # ...

此玩具示例将失败,并显示以下信息:

multiprocessing.managers.RemoteError: 
---------------------------------------------------------------------------
Unserializable message: ('#RETURN', <unlocked _thread.lock object at 0x7f9a4c9dc468>)

任何想法如何解决这个问题?我可以使用条件变量吗?还是您将如何保护资源列表?

2 个答案:

答案 0 :(得分:1)

好吧,好像是ptyhon3.5的错误。

使用python3.6,它就像是一种魅力。

答案 1 :(得分:0)

我敢肯定有可能。我在运行此代码时没有收到错误...我只是将SomeClass替换为'x'。因此,也许有一个问题存在。 另外,使用上下文管理器来获取和释放锁是一个很好的小抽象……

manager = multiprocessing.Manager()
locks = {key : manager.Lock() for key in range(100)}
shared_resource = {key : 'x' for key in range(100)}

# later in a multi-processed function
def foo(key):
   # ...
  with locks[key]:
  shared_resource[key] = 'xoyo'

if __name__ == '__main__':
    p = Process(target=foo, args=(1,))
    p.start()
    p = Process(target=foo, args=(1,))
    p.start()
    p = Process(target=foo, args=(1,))
    p.start()
    p.join()