作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在各种邮件列表和论坛上看到,人们不断提到 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()
from __future__ import print_function
时也是这种情况
最佳答案
对于 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/
我是一名优秀的程序员,十分优秀!