python线程是否等待标准输出?

python线程是否等待标准输出?,python,multithreading,Python,Multithreading,如果运行两个线程,但它们都必须打印到同一个标准输出,这是否意味着它们必须互相等待?所以说,如果所有4个线程都有东西要写,它们必须暂停并等待stdout空闲,以便继续工作?Deep(Deep-Deep…)在操作系统的系统调用中,是的。现代操作系统具有线程安全的终端打印例程,通常只锁定执行实际设备访问的关键部分(或缓冲区,具体取决于您写入的内容及其设置)。然而,这些等待时间非常短。请记住,这里处理的是IO,因此相对于实际IO执行,等待时间可能可以忽略不计。这取决于具体情况。如果stdout是一个管道

如果运行两个线程,但它们都必须打印到同一个标准输出,这是否意味着它们必须互相等待?所以说,如果所有4个线程都有东西要写,它们必须暂停并等待stdout空闲,以便继续工作?

Deep(Deep-Deep…)在操作系统的系统调用中,是的。现代操作系统具有线程安全的终端打印例程,通常只锁定执行实际设备访问的关键部分(或缓冲区,具体取决于您写入的内容及其设置)。然而,这些等待时间非常短。请记住,这里处理的是IO,因此相对于实际IO执行,等待时间可能可以忽略不计。

这取决于具体情况。如果stdout是一个管道,则每个管道都会获得一个4KB的缓冲区,您可以在创建管道时覆盖该缓冲区。当缓冲区已满或调用
flush()
时,缓冲区被刷新

如果stdout是一个终端,输出通常是行缓冲的。所以,在打印换行符之前,所有线程都可以写入它们的缓冲区。写入换行符时,整个缓冲区将转储到控制台上,同时写入换行符的所有其他线程都必须等待

由于线程除了写换行外还做其他事情,所以每个线程都会得到一些CPU。因此,即使在最坏的情况下,拥堵也应该相当小


但是有一个例外:如果您写入了大量数据,或者控制台速度很慢(比如使用串行端口的Linux内核调试控制台)。当控制台无法处理大量数据时,越来越多的线程将挂起在换行符的写入中,等待缓冲区刷新。

我可以想象stdout将有一个缓冲区,每个线程都可以写入并继续,因此,如果必须有多个线程写入缓冲区,我想可能会出现缓冲区溢出。不过我不确定。有兴趣看看别人的帖子吗