在python3 multiprocessing.Lock的共享字典

问题描述 投票:0回答:2

是否有可能有锁的python3共享字典?我需要多个锁,因为我要保护共享资源的字典。每个资源获取的锁:

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>)

任何想法如何解决这个问题?我可以使用条件变量?或者,你会如何保护资源的列表?

python-multiprocessing
2个回答
1
投票

好吧,好像它与ptyhon3.5的错误。

随着python3.6它就像一个魅力。


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()
© www.soinside.com 2019 - 2024. All rights reserved.