В Real World Haskell, глава 28, транзакционная память программного обеспечения, разработана параллельная веб-ссылка. Он извлекает все ссылки на веб-странице и каждый раз обращается к ним с запросом HEAD, чтобы выяснить, активна ли ссылка. Для создания этой программы используется параллельный подход, и делается следующее утверждение:
Мы не можем просто создать один поток для каждого URL-адреса, потому что это может перегрузить либо наш процессор, либо наше сетевое соединение, если (как мы ожидаем) большинство ссылок являются живыми и отзывчивыми. Вместо этого мы используем фиксированное количество рабочих потоков, которые извлекают URL-адреса для загрузки из очереди.
Я не совсем понимаю, зачем нужен этот пул потоков вместо использования forkIO
для каждой ссылки. AFAIK, среда исполнения Haskell поддерживает пул потоков и планирует их соответствующим образом, поэтому я не вижу перегрузки процессора. Кроме того, в обсуждении concurrency в списке рассылки Haskell я нашел следующее утверждение в том же направлении:
Одна парадигма, которая не имеет смысла в Haskell, - это рабочие потоки (поскольку RTS делает это для нас); вместо того, чтобы получать работника, вместо этого вместо forkIO.
Требуется ли только пул потоков для сетевой части или есть причина для процессора?