在 unix 中只有一个进程打印,多处理 python
Only one process prints in unix, multiprocessing python
我有一个脚本,我正在加载一个文件,这需要一段时间,因为有很多数据要读取,并且为了防止用户终止我想显示某种加载指示的进程。我认为这是学习如何使用多处理模块的好机会所以我写了这个例子来测试模块:
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 中,我没有从进度函数 process p1.
得到任何输出
正如 Mark 和 Dacav 所建议的,缓冲是问题所在。以下是一些可能的解决方案:
使用 python -u
到 运行 脚本
python -u
将取消缓冲 stdout 和 stderr。如果您可以接受,这是最简单的解决方案。
使用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
我有一个脚本,我正在加载一个文件,这需要一段时间,因为有很多数据要读取,并且为了防止用户终止我想显示某种加载指示的进程。我认为这是学习如何使用多处理模块的好机会所以我写了这个例子来测试模块:
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 中,我没有从进度函数 process p1.
得到任何输出正如 Mark 和 Dacav 所建议的,缓冲是问题所在。以下是一些可能的解决方案:
使用
python -u
到 运行 脚本python -u
将取消缓冲 stdout 和 stderr。如果您可以接受,这是最简单的解决方案。使用
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