【问题标题】:Can I acquire multiprocessing's Lock in a with statement?我可以在 with 语句中获取多处理的 Lock 吗?
【发布时间】:2013-08-22 16:58:40
【问题描述】:

如果进程未能解锁multiprocessing 锁,可能会发生可怕的事情。为了尽量减少发生这种情况的机会,我想在 with 块中获取锁。有什么内置方法可以做到这一点,还是我需要自己动手?

【问题讨论】:

  • 你试过了吗,它引发了什么错误?我希望它能够正常工作。
  • @delnan 我也期待它。事实上Lock 的实例确实有__enter____exit__ 方法,但我在文档中找不到任何提及。
  • 那些锁是它们自己的上下文管理器。 with mylock: 有效。
  • multiprocessing.Lock 文档中的文档说是“threading.Lock 的克隆”,因此推测它支持相同的接口。

标签: python multiprocessing with-statement


【解决方案1】:

是的,你可以这样做:

with multiprocessing.Lock():
    ...

因为 Lock 是一个上下文管理器。 RLock 和线程中的 Lock 和 RLock 也是如此。

documentation 确实声明它是“threading.Lock 的克隆”,因此您可以参考"Using locks, conditions, and semaphores in the with statement"

[编辑 2020:documentation now mentions this explicitly]

【讨论】:

  • 这段代码 sn-p 有意义吗?我认为您必须事先定义锁(lock = multiprocessing.Lock(); with lock: ...),否则您每次只需创建一个新的锁对象(并有效地进行零锁定)。
  • 是的,如果你有一些东西需要真正防止并发访问,你应该把对象放在一个变量或属性中。我只是在演示它可以与 with 语句一起使用。
【解决方案2】:

是的,你可以。

Lock 的文档指出:

class multiprocessing.Lock

A non-recursive lock object: a clone of `threading.Lock`.

阅读threading的文档:

此模块提供的所有具有acquire()release() 方法可以用作 with 的上下文管理器 声明。

【讨论】:

    【解决方案3】:

    是的。 documentation 现在明确指出:

    Lock 支持上下文管理器协议,因此可以在 with 语句中使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-26
      • 1970-01-01
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多