【问题标题】:What's the correct way to perform multiple operations on a threading queue?在线程队列上执行多个操作的正确方法是什么?
【发布时间】:2014-06-03 06:17:42
【问题描述】:

我需要对 queue.Queue 执行一组操作,特别是通过它并打包重复的连续元素。我还想确保在这组操作期间只有一个线程访问队列。我看到 Queue 对象有一个互斥锁,但我也假设它是队列在其自己的操作期间执行锁定。拥有另一个互斥锁并不能保证队列在此期间不会被另一个线程访问,除非我组织我的代码来锁定第二个互斥锁。

为了安全地执行这些操作,有什么我不知道的技巧吗?

【问题讨论】:

  • 使用 BlockingQueue 实现。它们具有嵌入式同步。

标签: python multithreading python-3.x queue


【解决方案1】:

为此目的使用 Queue 对象的互斥锁。正是为了同步对底层队列的修改。

也许是子类并添加一个方法(如https://stackoverflow.com/a/7641976/132382 中的方法)来打包self.queue 中的连续重复项?

另外,我认为更好的是,子类 queue.Queue 并覆盖 _put 以便在将连续重复添加到队列后立即处理它们。 _put 的调用已经受到互斥保护(_put_get 等是 LifoQueue 等标准子类的实现方式):

class PackedQueue(queue.Queue):

  def _put(self, item):
    if item != self.queue[-1]:
      self.queue.append(item)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-30
    • 2021-08-23
    • 2012-10-15
    • 1970-01-01
    • 2014-09-26
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多