我需要对queue.Queue执行一组操作,特别是要遍历它并打包重复的连续元素。我还想确保在这组操作期间只有一个线程访问队列。我看到Queue对象有一个互斥锁,但我也假设队列在自己的操作中执行锁定。拥有另一个互斥锁并不能保证在此期间其他线程不会访问该队列,除非我组织我的代码来锁定第二个互斥锁。
为了安全地执行这些操作,有没有我不知道的技巧?
答案 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)