我在各种邮件列表和论坛上看到人们不断提到 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 内置打印 https://github.com/python/cpython/blob/2.7/Python/bltinmodule.c#L1580
- Python 3.6 内置打印 https://github.com/python/cpython/blob/3.6/Python/bltinmodule.c#L1744
我只是想了解为什么会出现这种情况?
对于 Python 3.7:print()
函数是一个builtin https://docs.python.org/3.7/library/functions.html#print,它默认将输出发送到sys.stdout
, the 其中的文档 https://docs.python.org/3.7/library/sys.html#sys.stdout除其他外,他说:
交互时,stdout 和 stderr 流是行缓冲的。
否则,它们像常规文本文件一样被块缓冲。你可以
使用 -u 命令行选项覆盖此值。
所以它确实是交互模式和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
由所使用的缓冲策略决定。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)