Как делать многопоточность для парсера?
К сожалению вопрос коротким не получится. У меня есть представление как работает multithread и async, что такое мьютексы и т.д., но нет понимания как оптимально написать программу, потому что я никак не разберусь когда процессор работает, а когда отдыхает.
Ситуация: Есть парсеры которые работают в сотни потоков. Судя по тому что я знаю про многопоточность, всё что превышает количество ядер процессора получает процессорное время на какой-то небольшой период, после чего ядро переключается на другой поток, обратно и т.д. Допустим моя программа работает через прокси, пропускная способность у них разная, в основном маленькая. Что делают ядра в то время когда через прокси медленно скачивается контент? Имеет ли смысл создавать 100 потоков, или ограничиться 12ю, по кол-ву ядер? Или просто методом наблюдения за скоростью исполнения задач, нагрузкой ядер, подбирать кол-во потоков?
Ответы (1 шт):
Так как вопрос размытый, ответ будет скорее сборником советов, основанных на многолетнем опыте работы с HPC:
Никогда нет смысла делать потоков больше чем ядер, в противном случае будут непродуктивные затраты на переключение потоков.
Внутри потока необходимо организовывать менеджмент задач - например, не допускать блокирования потока на операциях c сокетами, а вместо этого загружать его другой работенкой, если она есть.
Как можно меньше использовать обращения к операционной системе, например, мьютексы. Больше ипользовать lock-free решения типа facebook/folly