2016-01-30 53 views
1

我有一個包含打印語句的小型多線程程序。 如果我沒有將end更改爲除\n之外的其他字符,它可以很好地工作。 如果我想使用其他字符而不是\n,我需要將flush設置爲True在Python中,沖洗如何工作,原因是什麼?

所以我的問題是如何沖洗的作品,是什麼原因?

#!/usr/bin/env python -u 
# -*- coding: utf-8 -*- 
from threading import Thread 
from queue import Queue 
from time import sleep 


def do_stuff(task): 
    while not task.empty(): 
     sleep(1) 
     print(task.get()) # works well 
     # print(task.get(), end='\n') # works well 
     # print(task.get(), end=',', flush=True) # works well 
     # print(task.get(), end=',') # works badly 
     task.task_done() 


q = Queue(maxsize=0) 
for x in range(0, 5): 
    q.put(x) 

num_threads = 2 

for i in range(num_threads): 
    worker = Thread(target=do_stuff, args=(q,)) 
    worker.setDaemon(True) 
    worker.start() 

q.join() 

回答

2

當您在蟒紋和使用作爲最後一個字符用逗號(而不是文字而是作爲分離的標誌),因爲它正在等待另一個打印語句的輸出沒有得到刷新。這是打印命令中逗號的功能。如果您不將逗號添加到打印命令中,它應該刷新並在該過程中創建一個新行,實際上相反,它會創建一個換行符併爲此刷新。

print(task.get(), end=',') 

將在沒有換行符的情況下打印,並在刷新緩衝區之前等待下一個將創建新行的打印。

print(task.get()) 
print(task.get(), end='\n') # works well 

將打印的東西,包括一個新的生產線,並刷新緩衝區。

在許多控制檯輸出應用程序中,這是非常普遍的做法,與C和C++的行爲完全相同。換行符被用作緩衝區的標誌以清空,如果緩衝區在每個字符之後都會清空,它會消耗太多的CPU。

print(task.get(), end=',', flush=True) 

上述工作,因爲我們明確地說,沖洗緩衝區。將不會有新行,但打印語句將刷新緩衝區並立即打印。

+0

你的答案有點Py2爲中心,而OP的代碼是Py3。 – BrianO

+0

@BrianO aaah我錯過了這一點。那麼參數是一樣的,只有函數調用是不同的..讓我更新答案 –

+0

換句話說,任何時候end等於除了新行之外的任何東西,我們應該使用flush = True? –

相關問題