python print() 在同时调用时如何实际工作?
Posted
技术标签:
【中文标题】python print() 在同时调用时如何实际工作?【英文标题】:How does python print() actually work when called concurrently? 【发布时间】:2021-12-27 01:49:02 【问题描述】:我试图学习 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(...)
在从更多并发调用时应该如何表现不止一个线程。我不知道答案,但如果事实证明存在 no 规则,请不要感到惊讶。线程是 Python 的一个相对较新的补充(无论如何都比 print
新)完全有可能没有人开始编写规范来说明从多个线程调用时 print(...)
的行为方式。
好的,更新了问题。似乎打印在某种程度上是基于时间的,这很有趣。
据我了解,您正在对同一个 PyObject 使用多个入口点(同时),如果门(入口点)关闭,您只会得到一个输出。所以你需要一点时间来执行你的代码。
【参考方案1】:
请注意,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()
调用完成后执行:
Thread 1: puts("y")
Thread 1: puts("\n")
// ~1mS of time-delay passes
Thread 2: puts("x")
Thread 2: puts("\n")
...所以在这种情况下,您会得到输出“y\nx\n”。
【讨论】:
以上是关于python print() 在同时调用时如何实际工作?的主要内容,如果未能解决你的问题,请参考以下文章