当并发调用python print()时,它实际上是如何工作的



我试图学习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

请注意,print()输出字符串,后跟换行符(又名"\n&"(。

我怀疑print((函数包含两个对较低级别C函数(例如puts(((的调用,该函数处理字符到stdout的实际传输。第一个puts()传输字符串的字符,然后第二个调用传输隐式换行符。

当您(几乎(同时运行两个线程时,第二个线程的print()调用可能会在这两个较低级别的调用之间抢占第一个线程print()调用的执行,因此您可以获得以下执行顺序:

Thread 1:  puts("y")
Thread 2:  puts("x")
Thread 2:  puts("n")
Thread 1:  puts("n")

这导致字符串"0";yx\n";打印到stdout,如您所见。

time.sleep()添加到主线程会导致第二个线程的print()调用的执行延迟,直到第一个线程的print()-调用完成:

Thread 1:  puts("y")
Thread 1:  puts("n")
// ~1mS of time-delay passes
Thread 2:  puts("x")
Thread 2:  puts("n")

所以在这个场景中;y\nx\n";相反

最新更新