我試圖學習python的執行緒,我發現了這些結果。我想知道 python 的 print() 實際上是如何輸出到控制臺的。
import threading
import time
def testing(name):
print(name)
y = threading.Thread(target=testing, args=("y",))
y.start()
x = threading.Thread(target=testing, args=("x",))
x.start()
輸出
yx
import threading
import time
def testing(name):
print(name)
y = threading.Thread(target=testing, args=("y",))
y.start()
time.sleep(.001)
x = threading.Thread(target=testing, args=("x",))
x.start()
輸出
y
x
真的我的問題是為什么不是第一個的輸出:
y
x
uj5u.com熱心網友回復:
請注意,print()輸出您的字串,后跟換行符(又名“\n”)。
我懷疑 print() 函式包含對低級 C 函式(例如puts())的兩次呼叫,該函式處理將字符實際傳輸到標準輸出。第一個puts()傳輸字串的字符,然后第二個呼叫傳輸隱式換行符。
當您(幾乎)同時運行兩個執行緒時,第二個執行緒的print()呼叫可能會print()在這兩個較低級別的呼叫之間搶占第一個執行緒的呼叫的執行,以便您獲得以下執行順序:
Thread 1: puts("y")
Thread 2: puts("x")
Thread 2: puts("\n")
Thread 1: puts("\n")
.... 這會導致字串 "yx\n\n" 列印到標準輸出,如您所見。
向time.sleep()主執行緒添加會導致第二個執行緒的print()呼叫的執行延遲到第一個執行緒的print()-call 完成之后:
Thread 1: puts("y")
Thread 1: puts("\n")
// ~1mS of time-delay passes
Thread 2: puts("x")
Thread 2: puts("\n")
...所以在這種情況下,您會得到輸出“y\nx\n”。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/359324.html
