如何使这个代码与Queue一起使用?

时间:2014-04-19 05:31:59

标签: python multithreading queue

我有点怀疑是否可以解决我的问题,并在线程之间创建成功的通信。

第一个例子,这是它应该如何工作,但效果不好:

import Queue,threading,time

class th(threading.Thread):
    def __init__(self,q):
        threading.Thread.__init__(self)
        self.q = q
        self.t = time

    def run(self):
        for i in range(5):
            self.q.put(i)
            self.t.sleep(0.5) # <----------
        self.q.put('end')

class main(object):
    def __init__(self):
        self.q = Queue.Queue()
        self.thread = th(self.q)
        self.thread.setDaemon(True)
        self.thread.run()
        self.call()
    def call(self):
        while True:
            recv = self.q.get();
            if recv == 'end':
                break
            else:
                print recv

if __name__ == '__main__':
    root = main()
    root.call()

在此示例中,所有内容同时打印: 0,1,2,3,4

第二个例子:

import Queue,threading,time

class th(threading.Thread):
    def __init__(self,q):
        threading.Thread.__init__(self);
        self.q = q
        self.t = time

    def run(self):
        for i in range(5):
            self.q.put(i) # <------ no sleep()
        self.q.put('end')

class main(object):
    def __init__(self):
        self.q = Queue.Queue()
        self.thread = th(self.q)
        self.thread.setDaemon(True)
        self.thread.run()
        self.call()
    def call(self):
        while True:
            recv = self.q.get()
            if recv == 'end':
                break
            else:
                print recv

if __name__ == '__main__':
    root = main()
    root.call()

代码按原样打印 0, 1 2 3 4

一对一

sleep是否有同样的功能?

2 个答案:

答案 0 :(得分:2)

您不希望直接在线程上调用run方法。改为调用start,这将启动子线程,而子线程将依次运行run方法。

您当前的代码基本上是单线程的,因为run调用会在父级中执行子线程的工作。子线程从未真正启动过! (你也是两次调用main.call方法,我希望阻止或引发异常,但这是一个单独的问题。)

答案 1 :(得分:0)

抱歉,这很简单,非常简单,只需要替换

self.thread.run() 

通过

self.threat.start()