来自线程的收益项

时间:2011-06-12 20:02:54

标签: python

from threading import Thread
import time
print 'start of script'

class MyThread(Thread):
    def __init__(self, start, end):
        self.start = start
        self.end = end
    def run(self):
        for i in xrange(self.start,self.end):
            yield i




my_threads = []

my_thread = MyThread(1,6)
my_thread.start()
my_threads.append(my_thread)

my_thread = MyThread(6,11)
my_thread.start()
my_threads.append(my_thread)

my_thread = MyThread(11,16)
my_thread.start()
my_threads.append(my_thread)


for t in my_threads:
    print t.join()

print 'end of script'

我该如何正确地做到这一点? 我正在尝试打印数字:range(1,16)其中我从函数的输出中获取此数字在单独的线程中运行。

据我所知,我不会顺序得到这个数字范围,因为在不同的线程中运行的函数的性质。

我也知道我可以简单地在线程的函数本身中打印它们,但这不是重点,我想在我的代码的主线程或主要部分中打印我已经回复的内容。

2 个答案:

答案 0 :(得分:4)

线程不返回值,因此您无法将值返回到主线程,如您所愿。如果您要让脚本运行(您需要将start变量的名称更改为其他内容,因为您正在隐藏start方法),您会看到返回值t.join()None。解决此问题的常用方法是使用Queue,如同类似问题中所述:Return value from thread

在您的情况下,我不会调用yield i而是调用queue.put(i),其中queue是在构造期间传入的Queue.Queue,然后在主线程中有一个循环我加入了我的主题:

while True:
    try:
        print outqueue.get(True, 1)
    except Empty:
        break

for t in my_threads:
    print t.join()

在投掷Empty并突破while循环之前,新项目会等待1秒钟。

答案 1 :(得分:0)

我认为你要找的是Queue。将队列传递到您的线程中,然后将其放入队列(myqueue.put(i)),而不是产生值。然后你可以在主线程(myqueue.get())中获取它们。