#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: вероятно, просто повезло)