我有一个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完成所需的时间,但我希望它们逐个显示,以向用户显示程序未挂起。
答案 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()