@Blankspace

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

Допустим у меня 6 ядер, 6 потоков на процессоре, как я могу максимально загрузить процессор для параллельных задач?
Конкретно: мне нужно парсить несколько сайтов одновременно: (если я правильно понимаю 1 процесс я беру на 1 ядро (поправьте, если не прав) то есть максимум я могу выполнять 6 потоков одновременно?).
1 парсер работает циклом, то есть подключается к proxy серверу, парсит, работает с пойманными данными, как только обработает данные, подключается к другому прокси и парсит заново…
Сколько максимально я могу парсить сайтов по такой схеме, ориентируясь на мощность процессора ?
Как это написать на питоне, на примере простейших циклов?
Может ли мультипоточность работать одновременно с прокси?
Как в этом случае не обезопасить себя от загрузки ядра на 100% и остановки работы всех процессов из-за этого?
  • Вопрос задан
  • 108 просмотров
Пригласить эксперта
Ответы на вопрос 2
@deliro
Парсинг сайтов чаще всего упирается с IO, а не CPU. 99% времени ты будешь сидеть и ждать ответа от сервера. Ядра тут вообще не нужны. Достаточно в asyncio закинуть тасков на HTTP запросы через какой-нибудь httpx или aiohttp и всё будет прекрасно "одновременно" качаться в одном потоке на одном ядре. А потом разгребать ответы либо синхронно, либо создать пул процессов (ProcessPoolExecutor) и парсить HTML/JSON или что у тебя там в процессах, если CPU вдруг начал нагружаться на 100%

Потоки в питоне не умеют работать одновременно, нагружая разные ядра процессора, кроме очень исключительных случаев.
Ответ написан
Комментировать
mayton2019
@mayton2019
Bigdata Engineer
Blankspace у

1) тебя все задачи - независимые. Ты можешь запускать 6 отдельных процессов на Python. В таком случае тебе не надо думать о синхронизации потоков.
2) ты описал задачу максимальной утилизации ресурсов. Это - неверная задача. Это все равно что ты захотел сжечь побольше бензина. Цель - быстрее закончить парсинг N сайтов например используя M proxy серверов.
3) Твой вопрос
Сколько максимально я могу парсить сайтов по такой схеме, ориентируясь на мощность процессора

Ответ - никто не знает. Не существует такой расчетной формулы. Есть скорее сет экспериментов которые ты сам будешь запускать на своей конфигурации и в зависимости от параметров (M,N) и получать результирующее время в секундах или в минутах. Процессорные мощности здесь скорее всего нипричем. Здесь сильнее влияет канал ввода вывода. Тоесть скорость сети и скорость с которой ты сохраняешь на диск разобранные данные.

Точно также поступают архитекторы когда думают о дизайне очень сложной системы. Просто берут аналог. И его цифры. И пытаются осторожно экстраполировать цифры.

Мегагерцы и мегафлопы и количество ядер процессора - эти метрики можно использовать в других задачах не похожих на твою.

Почитай также про закон Амдала. Он сработает в твоём случае.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы