' JoinableQueue'对象不可迭代

时间:2014-06-24 08:59:13

标签: python for-loop queue multiprocessing

假设我有一个队列:

myqueue = multiporcessing.JoinableQueue()

在我的代码中,父进程将所有对象(例如字符串)放入myqueue,'myqueue'将由子进程共享,并且子进程将需要检查是否有对象(例如xxx) )在myqueue,我试图使用:

if xxx in [y for y in myqueue]

但它给我的错误如下:

'JoinableQueue' object is not iterable

我的问题是,有什么其他方法可以用来获得我想要的东西吗?或者我可以用任何方式检查一个对象是否仍在队列中?

检查共享队列的原因是队列中的对象是相互依赖的,并且每个对象都具有某些状态,例如“正在运行”,“正在等待”,“已完成”。例如,对象'a'具有依赖关系'A','A'和'a'将由父进程(在子进程启动之前)放入队列,此时子进程从队列中获取'a' ,它需要检查'A'的状态,如果'A'的状态仍然'等待',那么'a'将被放回队列,除非'A''完成'。换句话说,'A'不再是myqueue。

1 个答案:

答案 0 :(得分:1)

JoinableQueue并不支持任何形式的窥视(除非您算上empty / full)。

此外,根据您对集合的要求,您可能需要一个不同的对象来存储队列。但是,有两种可能的解决方案:

  1. 如果你知道在检查时没有其他进程会触及队列,你可以get每个对象,看看你在找什么,然后put他们回来以相同的顺序。

  2. 否则,如果子进程是get个对象的唯一进程,则可以将对象放在另一个临时队列中。

  3. 前者应该直截了当地实施。后者可能是这样的:

    class QueueView:
        def __init__(self, joinable):
            self.joinable = joinable
            self.other = collections.deque()
        def get(self, block=True, timeout=None):
            if self.other:
                return self.other.popleft()
            self.joinable.get(block, timeout)
        def __contains__(self, item):
            if item in self.other:
                return True
            try:
                while True:
                    o = self.joinable.get(block=False)
                    self.other.append(o)
            except Queue.Empty:
                pass
            return item in self.other
    

    只有一个进程可以看到QueueView对象和getJoinableQueue到视图对象的任何内容。任何数量的流程都可以put中的JoinableQueue个内容。