Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 纯Haskell代码是否需要线程池?_Multithreading_Haskell - Fatal编程技术网

Multithreading 纯Haskell代码是否需要线程池?

Multithreading 纯Haskell代码是否需要线程池?,multithreading,haskell,Multithreading,Haskell,在中,开发了一个并发web链接检查器。它获取一个网页中的所有链接,每点击一次,并发出一个HEAD请求,以确定该链接是否处于活动状态。采用并行方法构建该程序,并做出以下声明: 我们不能简单地为每个URL创建一个线程,因为如果(正如我们所期望的)大多数链接都是活动的和响应的,那么这可能会使我们的CPU或网络连接负担过重。相反,我们使用固定数量的工作线程,从队列中获取要下载的URL 我不完全理解为什么需要这个线程池,而不是为每个链接使用forkIO。好的,Haskell运行时维护一个线程池,并对它们进

在中,开发了一个并发web链接检查器。它获取一个网页中的所有链接,每点击一次,并发出一个HEAD请求,以确定该链接是否处于活动状态。采用并行方法构建该程序,并做出以下声明:

我们不能简单地为每个URL创建一个线程,因为如果(正如我们所期望的)大多数链接都是活动的和响应的,那么这可能会使我们的CPU或网络连接负担过重。相反,我们使用固定数量的工作线程,从队列中获取要下载的URL

我不完全理解为什么需要这个线程池,而不是为每个链接使用
forkIO
。好的,Haskell运行时维护一个线程池,并对它们进行适当的调度,这样我就不会看到CPU过载。此外,在中,我发现以下陈述的方向是相同的:

在Haskell中没有意义的一个范例是工作线程(因为RTS就是这样做的) 对我们而言);与其找工人,不如用forkIO代替


线程池仅仅是网络部分所需的,还是也有CPU原因呢?

我想,核心问题是网络端。如果每个链接有10000个链接和forkIO,那么您可能会同时打开10000个套接字,这取决于操作系统的配置方式,可能根本不可能实现,效率会低很多

然而,事实上,我们有跨多个os线程“虚拟”调度的绿色线程(理想情况下,这些线程被固定在单个内核上),这并不意味着我们可以随意分配工作,而不考虑cpu使用情况。这里的问题不是CPU本身的调度不能为我们处理,而是上下文切换(甚至绿色切换)的成本周期。如果每个线程处理不同的数据,则需要将该数据拉入cpu。如果有足够的数据,这就意味着要将数据从cpu缓存中取出或取出。即使没有这一点,它也意味着将缓存中的内容拉到寄存器中,等等


即使一个问题是微不足道的并行问题,但实际上,将其分解为尽可能小的部分并尝试“一次完成”也绝不是正确的想法。

需要池来控制并发级别并对其进行管理。你可能忘记了实际考虑。。Haskell runtime确实非常擅长维护Haskell space线程——它们非常轻量级,您可以生成数千个线程,没有问题。但是,当您获取一个包含10万个URL的列表,然后在没有“池”的情况下一个接一个地分叉时,会发生什么呢?你可能会建立成千上万的联系。很多人会超时,你的系统会耗尽文件描述符,你可能会在试图处理结果时耗尽RAM。哈哈!看起来我们是在同一时间(15秒内)评论/回答的!在单线程中排队时,也需要将数据从缓存拉到寄存器。我觉得在这种情况下,管理开销更重要。