[英]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中運行它時,它可以正常工作,它會打印“正在加載”並按順序添加點,直到加載程序完成。 但是在我需要它工作的unix中,我沒有從進度函數,進程p1獲得任何輸出。
正如Mark和Dacav所說,緩沖就是問題所在。 這是一些可能的解決方案:
使用python -u
運行腳本
python -u
將unbuffer stdout和stderr。 如果您可以接受,這是最簡單的解決方案。
使用sys.stdout.flush
sys.stdout.flush
將從緩沖區刷新stdout。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.