Как делать многопоточность для парсера?

К сожалению вопрос коротким не получится. У меня есть представление как работает multithread и async, что такое мьютексы и т.д., но нет понимания как оптимально написать программу, потому что я никак не разберусь когда процессор работает, а когда отдыхает.

Ситуация: Есть парсеры которые работают в сотни потоков. Судя по тому что я знаю про многопоточность, всё что превышает количество ядер процессора получает процессорное время на какой-то небольшой период, после чего ядро переключается на другой поток, обратно и т.д. Допустим моя программа работает через прокси, пропускная способность у них разная, в основном маленькая. Что делают ядра в то время когда через прокси медленно скачивается контент? Имеет ли смысл создавать 100 потоков, или ограничиться 12ю, по кол-ву ядер? Или просто методом наблюдения за скоростью исполнения задач, нагрузкой ядер, подбирать кол-во потоков?


Ответы (1 шт):

Автор решения: gbg

Так как вопрос размытый, ответ будет скорее сборником советов, основанных на многолетнем опыте работы с HPC:

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

  2. Внутри потока необходимо организовывать менеджмент задач - например, не допускать блокирования потока на операциях c сокетами, а вместо этого загружать его другой работенкой, если она есть.

  3. Как можно меньше использовать обращения к операционной системе, например, мьютексы. Больше ипользовать lock-free решения типа facebook/folly

→ Ссылка