python线程只在连接后打印到stdout

时间:2014-07-17 16:58:13

标签: python multithreading python-multithreading

我有一个python程序,我正在尝试添加进度条。我的线程类是:

class ProgressThread(threading.Thread):
    def __init__(self):
        super(ProgressThread, self).__init__()
        self.stoprequest = threading.Event()

    def run(self):
        while not self.stoprequest.is_set():
            print ".",
            time.sleep(5)

    def join(self, timeout=None):
        self.stoprequest.set()
        super(ProgressThread, self).join(timeout)

然后在我的主线程中,我正在使用上面的线程类:

progress_thread = ProgressThread()
progress_thread.start()
ret = long_running_method()
progress_thread.join()

我遇到的问题是在调用join()之前不会打印这些点。正确的点数对应于long_running_method完成所需的时间,但我希望它们逐个显示,以向用户显示程序未挂起。

2 个答案:

答案 0 :(得分:3)

我认为问题在于,当您使用print ".",时,您不会打印出换行符(逗号会阻止它)。默认情况下,stdout不会刷新到屏幕,直到它看到换行\n字符。您可以在sys.stdout.flush()语句后添加print来解决此问题。这将强制输出打印到屏幕。

答案 1 :(得分:1)

您的代码在Mac上的Python 2.7.8和3.4.1中都适合我。这是我的测试用例:

import threading, time


class ProgressThread(threading.Thread):
   def __init__(self):
       super(ProgressThread, self).__init__()
       self.stoprequest = threading.Event()

   def run(self):
       while not self.stoprequest.is_set():
           print(".")
           time.sleep(1)

   def join(self, timeout=None):
       self.stoprequest.set()
       super(ProgressThread, self).join(timeout)

def long_running_method():
    time.sleep(5)

progress_thread = ProgressThread()
progress_thread.start()
ret = long_running_method()
progress_thread.join()

这可能是您的终端或操作系统的输出缓冲问题吗?尝试刷新输出:

import sys
sys.stdout.flush()