tellst1
@tellst1
Ламер

Как правильно и просто реализовать многопоточность в Python?

Нужно параллельно запускать 100+ потоков.

Пример:
file = open('file.txt')
lines = file.readlines()
def just():
	for line in lines:
		sleep(1)
		print(line)


Пробовал так, но каждый поток начинает цикл заного:
for i in range(0, 100):
    t = threading.Thread(target=just)
    t.start()
  • Вопрос задан
  • 900 просмотров
Решения вопроса 1
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
def just(lines):
  for line in lines:
    sleep(1)
    print(line)


file = open('file.txt')
lines = file.readlines()
step = len(lines) // 100

threads = []
for i in range(0, len(lines), step):
    t = threading.Thread(target=just, args=(lines[i:i+step],))
    t.start()
    threads.append(t)

for t in threads:
    t.join()
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Dvvarreyn
В питоне используется Global Interpreter Lock, и поэтому там нет эффективной параллельной многопоточности.
Питонячую многопоточность можно использовать только для организации всяких контролирующих потоков.
Для распараллеливания нужно использовать multiprocessing.

Чтение из файла не распараллеливается (по крайне мере, на одной машине, а на разных не будет потоков), так как файл не является данным со случайным доступом.
Раскидывание чтения между потоками приводит в питоне к квадратичному алгоритму, вместо линейного. Отсюда и замедление.

Я бы порекомендовал выбрать более разумную задачу для распараллеливания. И дальше начать с разбора примера

import multiprocessing 

def proc(a):
  <…>
  return something

pool = multiprocessing.Pool(3) # ну может 4. 

result = pool.map(proc, list(range(100)))
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы