2014-04-18 62 views
2

我需要对一个queue.Queue执行一组操作,特别是通过它并打包重复的连续元素。我也想确保在这组操作中只有一个线程访问队列。我看到队列对象有一个互斥锁,但我也假定这是队列在自己的操作过程中执行锁定。另一个互斥体不保证队列不被其他线程访问,除非我组织我的代码来锁定第二个互斥体。在线程队列上执行多个操作的正确方法是什么?

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

+0

使用BlockingQueue实现。他们嵌入了同步。 –

回答

2

为此目的使用队列对象的互斥锁。正是在那里同步对基础队列的修改。

也许是子类并添加一个方法(如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) 
相关问题