首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python3中multiprocessing.Lock的共享判据

python3中multiprocessing.Lock的共享判据
EN

Stack Overflow用户
提问于 2019-02-02 19:57:20
回答 2查看 163关注 0票数 0

有没有可能在python3中共享一个锁的判决书?我需要多个锁,因为我想保护共享资源的字典。每个资源都有一个锁:

代码语言:javascript
复制
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()
  # ...

这个玩具示例将失败,并显示以下错误:

代码语言:javascript
复制
multiprocessing.managers.RemoteError: 
---------------------------------------------------------------------------
Unserializable message: ('#RETURN', <unlocked _thread.lock object at 0x7f9a4c9dc468>)

你知道如何解决这个问题吗?我可以使用条件变量吗?或者,您如何保护资源列表?

EN

回答 2

Stack Overflow用户

发布于 2019-02-03 20:56:35

好的,看起来这是ptyhon3.5的一个bug。

python3.6中,它就像一个护身符。

票数 1
EN

Stack Overflow用户

发布于 2019-02-02 21:02:24

我相信这是有可能的。当我运行这段代码时,我没有得到一个错误...我只是用'x‘替换了SomeClass。所以这里可能有个问题。此外,使用上下文管理器来获取和释放锁是一个很好的小抽象……

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54492849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档