Вывод Pycharm суммируется при использовании многопоточности

#python #multithreading #pycharm #python-multithreading

#python #многопоточность #pycharm #python-многопоточность

Вопрос:

Я изучал потоки, поэтому я создал простую программу в sublime text.

 import time
from threading import Thread


def func():
    for a in range(1, 101):
        print(a)


Threads = []

for i in range(25):
    t = Thread(target=func)
    Threads.append(t)

for i in Threads:
    i.start()
for i in Threads:
    i.join()
 

Но через несколько минут меня начало раздражать плохое качество автозаполнения.
Итак, я переключился на Pycharm Edu, и с выводом произошло что-то странное. В cmd это было так

 60
60
97
68
58
59
70
71
74
95
89
68
53
92
91
92
93
99
100
89
96
 

и в Pycharm вывод был

 6545
46
47
54
76
775981

66



6555
55

608264
67
48
 

Я не понимаю, что происходит.

Ответ №1:

print на самом деле это две разные записи в стандартный вывод: текст, а затем перевод строки. Так print(a) это:

 sys.stdout.write(str(a))
sys.stdout.write('n')
 

Если теперь несколько потоков пишут одновременно, это похоже на это:

 sys.stdout.write(str(a))
sys.stdout.write('n')
sys.stdout.write(str(a))
sys.stdout.write('n')
 

Или, иногда:

 sys.stdout.write(str(a))
sys.stdout.write(str(a))
sys.stdout.write('n')
sys.stdout.write('n')
 

Таким образом, вы получаете два числа в одной строке, а затем две новые строки.

Самое простое решение — соединить строки и новую строку перед использованием print:

 
def func():
    for a in range(1, 101):
        print(f'{a}n', end='')
 

Это дает правильный результат.

(что касается того, почему этого не произошло в CMD: вероятно, просто повезло)