我应该使用哪些库来获得更好的OCaml线程?

时间:2013-05-15 10:15:44

标签: ocaml

我在Why OCaml's threading is considered as `not enough`?

之前提出了相关问题

无论ocaml的线程有多“糟糕”,我都注意到一些图书馆说他们可以做真正的线程化。

例如, Lwt

  

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

如果我是对的,Jane Street aync_core 也会提供类似的内容。


但我很困惑。 Lwtaync_core提供类似Java threading的线程吗?

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

以什么方式,我可以在OCaml中获得“真正的线程”(就像在Java中一样)吗?


修改

我仍然感到困惑。

让我添加一个场景:

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

服务器应用程序的作用是:

  • 它会听取请求
  • 对于每个请求,它启动一个计算任务(假设成本为2分钟)
  • 当每项任务完成后,任务会将结果返回给main或直接将结果发送回客户端

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

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

2 个答案:

答案 0 :(得分:16)

您引用的并行服务器示例是使用fork通过简单的多处理模型很好地解决的难以置信的并行问题之一。几十年来,这在OCaml中已经可以实现了,是的,如果需要,您可以使用机器的所有内核进行几乎线性的加速。

要使用标准库的简单原语执行此操作,请参阅在线书籍“OCaml中的Unix系统编程”(2003年首次发布)和/或在线this Chapterthis chapter “使用OCaml开发应用程序”(2000年首次发布)。

您可能还想使用更高级别的库,例如rafix提到的Gerd Stolpmann的OCamlnet库,它为通常的客户端/服务器设计提供了大量的东西,也提供了更低级的多进程通信。库;见the documentation

Parmap也很有趣,但可能用于略有不同的用例(更多的是你同时拥有大量可用的数据,你想要并行处理相同的函数) ):Array.mapList.map(或fold)与计算并行化的插入式广告。

答案 1 :(得分:11)

您将发现最接近真实(抢先)线程的是内置线程库。通过这个意思,我的意思是你的编程模型将是相同的,但有两个重要的区别:

  • OCaml的本机线程不像Java那样轻量级。
  • 一次只执行一个线程,因此您无法利用多个进程。

这使得OCaml的线程成为并发或并行的非常糟糕的解决方案,因此通常人们会避免使用它们。但它们仍有其用途。

Lwt和Async非常相似,为您提供不同风格的线程 - 合作风格。协作线程与抢占式线程的不同之处在于,线程之间的上下文切换在代码中是显式的,并且阻塞调用始终从类型签名中显而易见。提供的协作线程非常便宜,非常适合并发,但同样不会帮助你使用parallelilsm(由于OCaml运行时的限制)。

有关合作线程的详细介绍,请参阅此内容:http://janestreet.github.io/guide-async.html

编辑:对于您的特定情况,我会使用Parmap,如果任务的计算密集程度与您的示例相同,那么从parmap启动进程的开销应该可以忽略不计。