假设我有一个队列:
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。
答案 0 :(得分:1)
JoinableQueue
并不支持任何形式的窥视(除非您算上empty
/ full
)。
此外,根据您对集合的要求,您可能需要一个不同的对象来存储队列。但是,有两种可能的解决方案:
如果你知道在检查时没有其他进程会触及队列,你可以get
每个对象,看看你在找什么,然后put
他们回来以相同的顺序。
否则,如果子进程是get
个对象的唯一进程,则可以将对象放在另一个临时队列中。
前者应该直截了当地实施。后者可能是这样的:
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
对象和get
从JoinableQueue
到视图对象的任何内容。任何数量的流程都可以put
中的JoinableQueue
个内容。