1

我正在尝试用做某事的工作人员来实现一个简单的队列。
程序应该等到工作人员完成清空队列,然后继续执行。
我拿了文档示例并尝试在一个类中实现它,因为这就是它将在我的项目中实现的方式。
像这样:

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(我测试它的地方),但它在命令行上完美地执行。
看来是环境问题。

4

1 回答 1

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)
于 2013-06-20T18:38:20.623 回答