ichuan.net

自信打不死的心态活到老

【已更新】python 中线程的 join 会延迟重定向后的标准输出

好久没写博客,原因是比较浮躁,心一直静不下来。今日先用一个小技术文章打破这个僵局。

先看下面程序:

#!/usr/bin/env python
# coding: utf-8
# yc@2011/12/26

import threading, time

def log(msg):
        print msg

def worker(s):
        while True:
                time.sleep(s)
                log('I am alive')

log('Creating worker...')
t = threading.Thread(target=worker, args=(2, ))
t.setDaemon(True)
t.start()
log('Worker started')

t.join()
log('Worker ended')

把这个程序保存为 test.py,然后执行 python test.py,会看到如下输出;

Creating worker...
Worker started
I am alive
I am alive
...

每两秒那个线程会向标准输出打印一句 I am alive。没问题吧?重新来,这样执行:python test.py >/tmp/x,将输出重定向到某文件,之后在另一 shell 窗口中执行 tail -f /tmp/x,预想结果应该是每两秒有输出,然而没有。再看 /tmp/x 文件,竟然是空的。

何解?

原因在于那个 `t.join()` 延迟了主线程重定向后的标准输出

经小 pan 同学点拨,不是 join() 的问题,而是重定向后的文件句柄的缓冲区导致的。解决方法是在 print msg 后调用 sys.stdout.flush()

那把 print msg 换成 sys.stdout.write(msg) 可以么?不行,还是需要刷新缓冲区。不过向标准错误输出写东西是会自动刷新的,可以试试把 print msg 换成 sys.stderr.write(msg)

Comments