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() 在同时调用时如何实际工作?的主要内容,如果未能解决你的问题,请参考以下文章

从模态表单调用时 RTD.RefreshData 崩溃

接口调用时对url进行Encode编码

Tornado之接口调用时方式执行顺序

从 update 语句成功调用函数,但从 select 语句调用时出错

如何在执行cmd命令同时在窗口中动态显示已用时间

《python编程》第二章笔记