线程脚本不打印到控制台

jas*_*ams 4 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()))
Run Code Online (Sandbox Code Playgroud)

问题是这不打印。在终端中,我输入 python threading.py (这是文件名),并且没有输出错误。所以代码可以编译,但只是不打印。换句话说,发生的事情是这样的:

$ python threading.py
$ 
Run Code Online (Sandbox Code Playgroud)

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

关于为什么不打印的任何想法?我运行的Python是2.7.8。提前致谢。

Kev*_*vin 7

根据thread文档,

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

因此,您的子线程很可能在打印任何内容之前就被终止,因为主线程结束得太快。

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

您还可以使用threading代替thread,并使用Thread.join,这会强制主线程等待,直到子线程完成执行。