首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为了更好地进行OCaml线程处理,我应该使用哪些库?

为了更好地进行OCaml线程处理,我应该使用哪些库?
EN

Stack Overflow用户
提问于 2013-05-15 10:15:43
回答 2查看 3.3K关注 0票数 11

我在之前问过一个相关的问题

不管ocaml的线程处理有多“糟糕”,我注意到一些库说它们可以进行真正的线程处理。

例如,Lwt

Lwt提供了一种新的选择。它提供了非常轻的协作线程;启动‘线程’是一个非常快速的操作,它不需要新堆栈、新进程或其他任何东西。此外,上下文切换非常快。事实上,这是如此容易,我们将启动一个线程为每个系统调用。并且组合协作线程将允许我们编写高度异步的程序。

此外,如果我是对的,Jane Streetaync_core也提供了类似的东西。

但我很困惑。Lwtaync_core是否提供类似于Java threading的线程处理?

如果我使用它们,我可以使用多cpu吗?

以何种方式,可以在OCaml中获得“真正的线程”(就像在Java中那样)?

编辑

我还是很困惑。

让我补充一种情况:

我有一个服务器(16 cpu cores)和一个服务器应用程序。

服务器应用程序所做的工作是:

  • 它倾听请求。
  • 对于每个请求,它将启动一个计算任务(假设完成时间为2分钟)
  • 当每个任务完成后,任务要么将结果返回主任务,要么直接将结果发送回客户端。

在Java中,这是非常容易的。我创建一个线程池,然后对每个请求在该池中创建一个线程。该线程将运行计算任务。这在Java中是成熟的,它可以利用16个cpu内核。我说的对吗?

所以我的问题是:我能在OCaml做同样的事情吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-15 13:15:55

您所举的并行服务器示例就是使用fork的简单多处理模型很好地解决了这些令人尴尬的并行问题之一。这在OCaml中已经做了几十年了,是的,如果您需要的话,您将使用机器的所有内核进行几乎线性的加速比。

要使用标准库的简单原语,请参阅联机书“UnixSystemProgramingin本章”(2003年首次发布)和/或“用OCaml开发应用程序”(2000年首次发布)的本章

您还可能希望使用更高级别的库,例如rafix中提到的Gerd的OCamlnet库,它提供了很多东西,从通常的客户机/服务器设计的直接助手到底层的多进程通信库;参见文献资料

帕图也很有趣,但是对于稍微不同的用例(更重要的是,您有大量的数据同时可用,您希望使用相同的函数并行处理):并行计算的Array.mapList.map (或fold)的插入重构。

票数 16
EN

Stack Overflow用户

发布于 2013-05-15 10:52:05

最接近真实(先发制人)线程的东西是内置的线程库。这意味着您的编程模型将是相同的,但是有两个重要的区别:

  • OCaml的原生线程并不像Java的那样轻量级。
  • 一次只执行一个线程,因此不能利用多个进程。

这使得OCaml的线程对于并发性或并行性来说都是一个非常糟糕的解决方案,因此一般人都避免使用它们。但它们仍然有它们的用途。

Lwt和异步非常相似,为您提供了一种不同的线程风格--合作风格。协作线程不同于抢占线程,因为线程之间的上下文切换在代码中是显式的,阻塞调用总是明显的类型签名。所提供的协作线程非常便宜,非常适合并发,但同样不会帮助您实现并行(由于OCaml的运行时的限制)。

有关合作线程的良好介绍,请参阅以下内容:http://janestreet.github.io/guide-async.html

编辑:对于您的特定场景,我将使用Parmap,如果任务像您的示例那样计算密集,那么从parmap启动进程的开销应该可以忽略不计。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16562394

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档