gpt4 book ai didi

multithreading - 是什么让 Python3 的打印函数线程安全?

转载 作者:行者123 更新时间:2023-12-03 12:43:42 30 4
gpt4 key购买 nike

我在各种邮件列表和论坛上看到,人们不断提到 Python 3 中的打印函数是线程安全的。从我自己的测试来看,我认为没有理由怀疑这一点。

import threading
import time
import random

def worker(letter):
print(letter * 50)


threads = [threading.Thread(target=worker, args=(let,)) for let in "ABCDEFGHIJ"]
for t in threads:
t.start()
for t in threads:
t.join()

当我使用 Python 3 运行它时,即使某些行可能出现问题,但它们仍然始终在自己的行上。然而,在 Python 2 中,输出相当零星。一些行连接在一起或缩进。我 from __future__ import print_function时也是这种情况
  • Python 2.7 builtin_print <- 不是线程安全的
  • Python 3.6 builtin_print <- 线程安全?

  • 我只是想了解为什么会这样?

    最佳答案

    对于 Python 3.7: print()函数是 builtin ,默认情况下将输出发送到 sys.stdout , documentation of which说,除其他外:

    When interactive, stdout and stderr streams are line-buffered.Otherwise, they are block-buffered like regular text files. You canoverride this value with the -u command-line option.


    所以它真的是交互模式和 sys.stderr的结合。负责 print 的行为功能如示例中所示。
    如果 worker,我们可以更接近真相示例程序中的函数更改为
    def worker(letter):
    print(letter*25, letter*25, sep='\n')
    然后我们得到类似于下面的输出,它清楚地表明 print本身不是线程安全的,您可以期望的是各个行不会相互交错。
    DDDDDDDDDDDDDDDDDDDDDDDDDJJJJJJJJJJJJJJJJJJJJJJJJJ

    JJJJJJJJJJJJJJJJJJJJJJJJJ
    DDDDDDDDDDDDDDDDDDDDDDDDDGGGGGGGGGGGGGGGGGGGGGGGGG
    GGGGGGGGGGGGGGGGGGGGGGGGGAAAAAAAAAAAAAAAAAAAAAAAAA
    AAAAAAAAAAAAAAAAAAAAAAAAAHHHHHHHHHHHHHHHHHHHHHHHHH
    HHHHHHHHHHHHHHHHHHHHHHHHH


    FFFFFFFFFFFFFFFFFFFFFFFFF
    IIIIIIIIIIIIIIIIIIIIIIIIICCCCCCCCCCCCCCCCCCCCCCCCC
    CCCCCCCCCCCCCCCCCCCCCCCCC
    IIIIIIIIIIIIIIIIIIIIIIIII

    EEEEEEEEEEEEEEEEEEEEEEEEE

    EEEEEEEEEEEEEEEEEEEEEEEEEFFFFFFFFFFFFFFFFFFFFFFFFF

    BBBBBBBBBBBBBBBBBBBBBBBBB
    BBBBBBBBBBBBBBBBBBBBBBBBB
    所以最终 print的线程安全由所使用的缓冲策略决定。

    关于multithreading - 是什么让 Python3 的打印函数线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42867866/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com