线程脚本不打印到控制台

时间:2015-06-23 13:40:00

标签: python stdout python-multithreading

这真令人困惑,我找不到答案。

import thread
import time
import random
import sys 

sys.stdout.flush()

def run_often(thread_name, sleep_time):
    while True:
        time.sleep(sleep_time)
        print "%s" % (thread_name)
def run_randomly(thread_name, sleep_time):
    while True:
        time.sleep(sleep_time)
        print "%s" % (thread_name)

thread.start_new_thread(run_often,("Often runs", 2)) 
thread.start_new_thread(run_randomly, ("Fast and random", random.random()))
问题是这不打印。在终端中,我键入python threading.py(即文件名)并且不输出错误。所以代码编译但它只是不打印。换句话说,就是这样:

$ python threading.py
$ 

我添加了sys.stdout.flush(),认为stdout需要重置,但无济于事。当我添加一个随机的打印语句,如" hello world"在任何函数的while循环之外,它被打印出来。此外,当我在ipython中运行完全相同的代码时,它会完美打印。这是从YouTube教程复制而来的,不是我自己的代码。

关于它为什么不打印的任何想法? Python I' m运行是2.7.8。 提前谢谢。

1 个答案:

答案 0 :(得分:4)

根据thread文档,

  

当主线程退出时,系统定义其他线程是否存活。在使用本机线程实现的SGI IRIX上,它们存活下来。在大多数其他系统上,它们被杀死而不执行try ... finally子句或执行对象析构函数。

所以很可能你的子线程在被打印之前被终止,因为主线程结束得太快了。

快速解决方案是让主线程在结束之前等待;添加time.sleep方法作为最后一行。

您也可以使用threading而不是thread,并使用Thread.join,这会强制主线程等到子线程执行完毕。