Python 线程会等待标准输出吗?
如果你同时运行几个线程,但它们都需要往同一个输出窗口(stdout)打印内容,这是不是意味着它们必须互相等待呢?比如说,如果四个线程都有东西要写,它们就得暂停,等输出窗口空闲了才能继续工作吗?
2 个回答
0
这要看情况。如果标准输出(stdout)是一个管道,每个管道会有一个4KB的缓冲区,你可以在创建管道时修改这个缓冲区的大小。当缓冲区满了或者你调用了flush()
这个命令时,缓冲区里的内容就会被清空。
如果标准输出是一个终端,输出通常是按行缓冲的。这意味着在你打印一个换行符之前,所有线程都可以往各自的缓冲区写东西。当你写入换行符时,整个缓冲区的内容会一次性显示在控制台上,而所有其他同时在写换行符的线程都得等着。
因为线程除了写换行符之外还会做其他事情,所以每个线程都会获得一些CPU时间。因此,即使在最糟糕的情况下,拥堵的情况也应该不会太严重。
不过有一个例外:如果你写入的数据量很大,或者控制台的速度很慢(比如Linux内核的调试控制台,它使用串口)。当控制台处理不了这么多数据时,会有越来越多的线程在写换行符的时候卡住,等待缓冲区被清空。
3
在操作系统的系统调用中,确实是这样。现代操作系统有线程安全的终端打印功能,这些功能通常会在进行实际设备访问(或者是缓冲区,具体取决于你写入的内容和设置)时进行锁定。不过,这些等待时间非常短。要记住,你处理的是输入输出(IO),所以这些等待时间相对于实际的输入输出执行来说,几乎可以忽略不计。