我试图学习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";相反