Python 与gevent.spawn同时运行队列中的所有条目

Python 与gevent.spawn同时运行队列中的所有条目,python,multithreading,concurrency,queue,gevent,Python,Multithreading,Concurrency,Queue,Gevent,根据我先前提出的问题: 我实施了这个解决方案: workq = gevent.queue.Queue() def workqueue(): while True: item = workq.get() if gevent.spawn(startWork,item).value != "Ok": workq.put(item) 这背后的想法是,所有队列项目在发生时都会生成一个工作绿绿灯,以便startwork(需要1-10分钟)对队列中的所有项目同时运行。问题

根据我先前提出的问题:

我实施了这个解决方案:

workq = gevent.queue.Queue()
def workqueue():
while True:
    item = workq.get() 
    if gevent.spawn(startWork,item).value != "Ok":
        workq.put(item)
这背后的想法是,所有队列项目在发生时都会生成一个工作绿绿灯,以便startwork(需要1-10分钟)对队列中的所有项目同时运行。问题是返回值会立即被检查,并且始终为“无”。当我在值检查之前放置一个连接时,我可以防止这种情况发生,但是我只能同时从队列中执行一个项目,因为我总是要等待结果。 所以我的问题是,有没有一种方法可以在小绿球出现时生成它们,当它们单独完成时,检查结果,如果不确定,将它们放回队列以再次继续

所以我的问题是,有没有一种方法可以在小绿球出现时生成它们,当它们单独完成时,检查结果,如果不确定,将它们放回队列以再次继续

你要找的是加入一整批工人的方法。您可以使用或
工作人员池
来执行此操作

但您希望在值出现时将其恢复,而不是在完成时一次恢复所有值。因此,你想要一个未来。据我所知,与线程和进程不同,greenlets还没有得到完整的future/executor抽象。绿地本身有点像期货,但没有什么能像等待(iterable\u of\u futures,FIRST\u COMPLETED)那样去拜访它们

或者,您可以只添加一个“输出队列”,让每个任务将其结果推送到输出队列上,然后从输出队列中取出所有值,直到完成为止。但是如何同时在两个队列上等待呢?最明显的方法是用两个小绿球

或者,最简单的方法是,将任务包装起来,以便在末尾重新附加该项:

def workqueue():
    def wrappedWork(item):
        value = startWork(item)
        if value != "Ok":
            workq.put(item)
    while True:
        item = workq.get()
        gevent.spawn(wrappedWork, item)

哇,谢谢你这个简单的解决方案。A只是在看芹菜和其他复杂的任务系统。