同时运行队列中的所有条目gevent.spawn生成

2024-10-16 22:26:09 发布

您现在位置:Python中文网/ 问答频道 /正文

根据我之前提出的问题:

check a list constantly and do something if list has items

我实施了这个解决方案:

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

这背后的想法是,所有队列项在发生时都会生成一个worker greenlet,以便startwork(需要1-10分钟)同时对队列中的所有项运行。问题是返回值会立即被检查,并且总是为none。当我在值检查之前放置一个连接时,我可以防止这种情况发生,但是由于我总是要等待结果,所以我只能同时处理队列中的一个项目。 所以我的问题是,有没有一种方法,当它们发生的时候,当它们单独完成时,检查结果,如果不好,就把它们放回队列中继续。在


Tags: andif队列queuecheckgeventitems解决方案
1条回答
网友
1楼 · 发布于 2024-10-16 22:26:09

So my question is there a way to spawn the greenlets as they occur and when they individually are done check for the result and if its not ok put them back to the queue to proceed again.

你要找的是加入一整批工人的方法。您可以使用一个^{}Pool的worker来完成此操作。在

但是你希望在值发生时就把它们取回来,而不是一次就完成了。为此,你想要一个像未来一样的东西。据我所知,与线程和进程不同,greenlets还没有得到完整的future/executor抽象。绿色信贷本身有点像期货,但没有什么比wait(iterable_of_futures, FIRST_COMPLETED)更能召唤它们了。在

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

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

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

相关问题 更多 >