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)其中我从函数的输出中获取此数字在单独的线程中运行。
据我所知,我不会顺序得到这个数字范围,因为在不同的线程中运行的函数的性质。
我也知道我可以简单地在线程的函数本身中打印它们,但这不是重点,我想在我的代码的主线程或主要部分中打印我已经回复的内容。
答案 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()
)中获取它们。