作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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),其中我从在单独线程中运行的函数的输出中获取此数字。
我知道我不会按顺序获取此范围内的数字,因为函数的本质是在单独的线程中运行。
我也知道我可以简单地在线程的函数本身中打印它们,但这不是重点,我想打印我在主线程或代码的主要部分返回的内容。
最佳答案
线程不返回值,因此您将无法像您希望的那样将值返回给主线程。如果您要运行脚本(您需要将 start
变量的名称更改为其他名称,因为您正在隐藏 start
方法),您会观察 t.join()
的返回值是 None
。解决此问题的一种常见方法是使用队列,正如在类似问题中所建议的那样: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 秒。
关于python - 从线程中获取项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6324318/
我是一名优秀的程序员,十分优秀!