2
我需要对一个queue.Queue执行一组操作,特别是通过它并打包重复的连续元素。我也想确保在这组操作中只有一个线程访问队列。我看到队列对象有一个互斥锁,但我也假定这是队列在自己的操作过程中执行锁定。另一个互斥体不保证队列不被其他线程访问,除非我组织我的代码来锁定第二个互斥体。在线程队列上执行多个操作的正确方法是什么?
为了安全地执行这些操作,有没有一个技巧我不知道?
我需要对一个queue.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)
使用BlockingQueue实现。他们嵌入了同步。 –