Python线程:队列工作者 - 挂起程序

时间:2013-06-14 12:58:54

标签: python multithreading queue

我正在尝试与工作人员一起实施一个简单的队列 程序应该等到工作人员完成清空队列,然后继续执行 我拿了documentation示例并试图在课堂上实现它,因为这是它将在我的项目中实现的方式。
像这样:

class Test:
    def __init__(self, n, q):
        self.q = Queue()

        print "Starting workers..."
        for i in range(n):
            t = threading.Thread(target=self.worker)
            t.daemon = True
            t.start()
        print "Workers started"

        for i in range(q):
            self.q.put(i)
        self.q.join()
        print "Exiting"

    def worker(self):
        name = threading.currentThread().getName()
        print "Thread %s started" % name
        while True:
            item = self.q.get()
            print "Processing item %d" % item
            sleep(1)
            self.q.task_done()

实例化课程t = Test(2, 100)时,我只能看到"Thread... started"个消息并且程序挂起。
代码有什么问题?

编辑:
我刚刚注意到,虽然这段代码在IDLE(我测试过它)中挂起,但它在命令行上运行完美。
看起来像是一个环境问题。

1 个答案:

答案 0 :(得分:1)

是的,这必须是一个环境问题。我甚至在几个不同的编辑器和PC上测试过它。

输出

Starting workers...
Thread Thread-1 started
Thread Thread-2 started
 Workers started
Processing item 0
 Processing item 1
Processing item 2
 Processing item 3
Processing item 4
 Processing item 5
Processing item 6
 Processing item 7
Processing item 8
 Processing item 9
Exiting

代码:

from Queue import Queue
import threading
from time import sleep

class Test:
    def __init__(self, n, q):
        self.q = Queue()

        print "Starting workers..."
        for i in range(n):
            t = threading.Thread(target=self.worker)
            t.daemon = True
            t.start()
        print "Workers started"

        for i in range(q):
            self.q.put(i)
        self.q.join()
        print "Exiting"

    def worker(self):
        name = threading.currentThread().getName()
        print "Thread %s started" % name
        while True:
            item = self.q.get()
            print "Processing item %d" % item
            sleep(1)
            self.q.task_done()

t = Test(2, 10)