我应该使用哪些库来实现更好的OCaml线程?
之前我曾问过一个相关的问题,为什么OCaml的线程被认为是“不够”?
不管ocaml的线程有多糟糕,我都注意到一些图书馆说他们可以做真正的线程。
例如, Lwt
Lwt提供了一种新的选择。 它提供了非常轻量级的合作线程; ``启动''一个线程是一个非常快速的操作,它不需要一个新的堆栈,一个新的进程或其他任何东西。 而且上下文切换非常快。 事实上,我们将为每个系统调用启动一个线程,这非常简单。 编写合作线程将允许我们编写高度异步的程序。
如果我是对的, Jane Street
的aync_core也提供类似的东西。
但我很困惑。 Lwt
或aync_core
提供像Java threading
一样的Java threading
吗?
如果我使用它们,我可以使用多个CPU吗?
以什么方式,我可以在OCaml中获得“真正的线程”(就像在Java中一样)?
编辑
我仍然困惑。
让我添加一个场景:
我有一个服务器( 16 cpu cores
)和一个服务器应用程序。
服务器应用程序的功能是:
在Java中,它非常简单。 我创建一个线程池,然后为每个请求创建一个线程池。 该线程将运行计算任务。 这在Java中是成熟的,它可以利用16个cpu核心。 我对吗?
所以我的问题是:我可以在OCaml中做同样的事情吗?
您引用的并行服务器的示例是使用fork
的简单多处理模型可以很好地解决的那些不寻常的并行问题之一。 这在OCaml中已经可以使用数十年了,是的,如果您需要的话,您可以使用机器的所有内核进行几乎线性的加速。
要使用标准库的简单原语来实现这一点,请参见联机手册“OCaml中的Unix系统编程”(2003年首次发布)和/或本书“使用OCaml开发应用程序”的第一章(第一部分在2000年发布)。
您可能还想使用更高级的库,例如rafix提到的Gerd Stolpmann的OCamlnet库,它为通常的客户端/服务器设计提供了大量来自直接帮助程序的内容,并提供给更低级别的多进程通信库; 请参阅文档。
库Parmap也很有趣,但可能会略有不同的用例(更多的是,您可以同时使用大量的数据,并且要使用相同的函数并行处理):一个嵌入式更换Array.map
或List.map
(或fold
)的并行计算。
最接近真实(抢先式)线程的是内置的线程库。 这意味着你的编程模型将是相同的,但有两个重要的区别:
这使OCaml的线程成为并发或并行的非常糟糕的解决方案,所以一般人都避免使用它们。 但他们仍然有他们的用途。
Lwt和Async非常相似,并为您提供了不同的线程风格 - 一种合作风格。 合作线程与抢先线程不同,事实上线程之间的切换在代码中是明确的,阻塞调用总是从类型签名中显而易见。 提供的协作线程非常便宜,非常适合并发,但再次无法帮助您使用parallelilsm(由于OCaml运行时的限制)。
请参阅以下有关协作式线程的简介:http://janestreet.github.io/guide-async.html
编辑:对于您的特定场景,我会使用Parmap,如果任务的计算密集程度如您的示例那么从parmap启动进程的开销应该可以忽略不计。
链接地址: http://www.djcxy.com/p/79337.html上一篇: What libraries should I use for better OCaml Threading?