在Real World Haskell,第 28 章,软件事务内存中,开发了一个并发 Web 链接检查器。它获取网页中的所有链接,并使用 HEAD 请求命中每一个链接,以确定链接是否处于活动状态。采用并发的方法来构建这个程序,并做出以下声明:
我们不能简单地为每个 URL 创建一个线程,因为如果(如我们所料)大多数链接都是活动的和响应式的,这可能会使我们的 CPU 或网络连接负担过重。相反,我们使用固定数量的工作线程,它们从队列中获取要下载的 URL。
我不完全理解为什么需要这个线程池而不是forkIO
为每个链接使用。AFAIK,Haskell 运行时维护一个线程池并适当地安排它们,所以我没有看到 CPU 过载。此外,在Haskell 邮件列表上关于并发的讨论中,我发现以下语句朝着相同的方向发展:
在 Haskell 中没有意义的一种范式是工作线程(因为 RTS 为我们做到了);而不是取一个工人,只是 forkIO 代替。
线程池是否只需要网络部分,还是有 CPU 原因?