在线程队列上执行多个操作的正确方法是什么?

时间:2014-04-18 17:36:45

标签: python multithreading python-3.x queue

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

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

1 个答案:

答案 0 :(得分:2)

为此目的使用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)