我有一个脚本,我正在加载一个文件,这需要一段时间,因为有相当多的数据要读取,并防止用户终止进程,我想显示某种加载指示。我认为这是一个学习如何使用多处理模块的好机会,所以我写了这个例子来测试模块:
import time, multiprocessing
def progress():
delay = 0.5
while True:
print "Loading.",
time.sleep(delay)
print "b.",
time.sleep(delay)
print "b.",
time.sleep(delay)
print "r r",
return
def loader(filename, con):
# Dummy loader
time.sleep(5)
con.send(filename)
con.close()
return
if __name__ == "__main__":
parrent_con, child_con = multiprocessing.Pipe()
filename = "main.key"
p1 = multiprocessing.Process(target=progress)
p2 = multiprocessing.Process(target=loader, args=(filename, child_con))
p1.start()
p2.start()
data = parrent_con.recv()
p1.terminate()
print "n", data
它像我期望的那样工作,当我在windows cmd中运行它时,它打印"Loading"并顺序添加点,直到加载器完成。但在unix中,我需要它的工作,我没有得到任何输出从进程函数,进程p1。
正如Mark和Dacav建议的那样,缓冲是问题所在。以下是一些可能的解决方案:
-
使用
python -u
运行脚本python -u
将取消对标准输出和标准错误的缓冲。如果你能接受,这是最简单的解决方案。 -
使用
sys.stdout.flush
sys.stdout.flush
将从缓冲区中刷新标准输出。delay = 0.5 while True: print("Loading."), sys.stdout.flush() time.sleep(delay) print("b."), sys.stdout.flush() time.sleep(delay) print("b."), sys.stdout.flush() time.sleep(delay) print("r r"), sys.stdout.flush() return