脚本多线程无法输出到控制台

3

这真的让我感到困惑,我找不到答案。

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,但是没有效果。当我在任何一个函数的while循环之外添加一个随机的print语句,比如"hello world",它会被打印出来。而且,当我在ipython中运行完全相同的代码时,它可以完美地打印出来。这段代码是从YouTube教程中复制来的,不是我的代码。

有什么想法为什么它没有打印?我使用的Python版本是2.7.8。 提前感谢您的帮助。

1个回答

7
根据thread文档,
当主线程退出时,系统会决定其他线程是否继续运行。在使用本地线程实现的SGI IRIX上,它们可以继续运行。在大多数其他系统上,它们被杀死,而不执行try...finally子句或执行对象析构函数。
因此,很可能你的子线程在打印任何内容之前就被终止了,因为主线程结束得太快了。
快速解决方案是使主线程在结束之前等待一段时间;在最后一行添加一个time.sleep方法。
你还可以使用threading代替thread,并使用Thread.join,它强制主线程等待直到子线程完成执行。

我该如何确定哪个是我的主线程?我想同时运行,这是否可能,或者我对线程的概念理解不正确? - jason adams
你有三个线程。主线程是那个不是“run_often”或“run_randomly”的线程。 - Kevin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接