С помощью приведенного ниже кода я попытался напечатать несколько вещей параллельно на ноутбуке jupyter, используя 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 и запустив его.Но с последним у меня, похоже, нет этой проблемы.Я попытался выполнить поиск, но все, что я получил, это то, что print()
в python-3.x является поточно-ориентированным.Если это действительно потокобезопасный, кто-нибудь может объяснить, почему это происходит?