即使所有队列项都已耗尽,Gevent线程也无法完成

Mri*_*lla 6 python gevent

我正在尝试在Gevent中建立一个简单的生产者 - 消费者系统,但我的脚本不会退出:

import gevent
from gevent.queue import *
import time
import random

q = Queue()
workers = []

def do_work(wid, value):
    """
    Actual blocking function
    """
    gevent.sleep(random.randint(0,2))
    print 'Task', value, 'done', wid
    return


def worker(wid):
    """
    Consumer
    """
    while True:
        item = q.get()
        do_work(wid, item)


def producer():
    """
    Producer
    """
    for i in range(4):
        workers.append(gevent.spawn(worker, random.randint(1, 100000)))


    for item in range(1, 9):
         q.put(item)

producer()
gevent.joinall(workers)
Run Code Online (Sandbox Code Playgroud)

我还没有找到关于使用Gevent的好例子/教程,所以我上面粘贴的是我从互联网上拼凑出来的东西.

多个工作程序被激活,项目进入队列,但即使队列中的所有内容都完成,主程序也不会退出.我要按CTRL ^ C.

我究竟做错了什么?

谢谢.

在旁注:如果我的脚本有任何可以改进的地方,请告诉我.简单的事情,例如检查队列何时为空,等等.

rec*_*dev 5

我认为你应该JoinableQueue像文档中的示例一样使用.

import gevent
from gevent.queue import *
import time
import random

q = JoinableQueue()
workers = []

def do_work(wid, value):
    gevent.sleep(random.randint(0,2))
    print 'Task', value, 'done', wid

def worker(wid):
    while True:
        item = q.get()
        try:
            do_work(wid, item)
        finally:
            q.task_done()


def producer():
    for i in range(4):
        workers.append(gevent.spawn(worker, random.randint(1, 100000)))

    for item in range(1, 9):
         q.put(item)

producer()
q.join()
Run Code Online (Sandbox Code Playgroud)