使用以下代码,我尝试在jupyter-notebook上使用ThreadPoolExecutor并行打印多个内容。请注意,使用show()函数时,输出结果与通常预期的不同。
from concurrent.futures import ThreadPoolExecutor
import sys
items = ['A','B','C','D','E','F',
'G','H','I','J','K','L',
'M','N','O','P','Q','R',
'S','T','U','V','W','X','Y','Z']
def show(name):
print(name, end=' ')
with ThreadPoolExecutor(10) as executor:
executor.map(show, items)
# This outputs
# AB C D E F G H I J KLMNOP QR STU VW XY Z
但是当我使用sys.stdout.write()
时,我没有得到这种行为。
def show2(name):
sys.stdout.write(name + ' ')
with ThreadPoolExecutor(10) as executor:
executor.map(show2, items)
# This gives
# A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
奇怪的是,我在jupyter笔记本和编写.py文件并运行它两种方式下都尝试了这个操作。但是,在后者中,我似乎没有遇到这个问题。我尝试搜索,但我得到的所有结果都是python-3.x中的print()
是线程安全的。如果确实是线程安全的,有人能解释一下为什么会发生这种情况吗?
print("%s "%(name), end ='')
时会发生什么?可能end=
变量正在将名称和空格作为不同的操作输出,其中上下文切换可能会在它们之间发生。使用已附加空格的单个字符串(并且是空的end
)进行打印可能会缓解这种情况。 - paxdiabloprint(..., flush=True)
。 - user9611000