我在?之前问过一个相关的问题
不管ocaml的线程处理有多“糟糕”,我注意到一些库说它们可以进行真正的线程处理。
例如,Lwt
Lwt提供了一种新的选择。它提供了非常轻的协作线程;启动‘线程’是一个非常快速的操作,它不需要新堆栈、新进程或其他任何东西。此外,上下文切换非常快。事实上,这是如此容易,我们将启动一个线程为每个系统调用。并且组合协作线程将允许我们编写高度异步的程序。
此外,如果我是对的,Jane Street的aync_core也提供了类似的东西。
但我很困惑。Lwt或aync_core是否提供类似于Java threading的线程处理?
如果我使用它们,我可以使用多cpu吗?
以何种方式,可以在OCaml中获得“真正的线程”(就像在Java中那样)?
编辑
我还是很困惑。
让我补充一种情况:
我有一个服务器(16 cpu cores)和一个服务器应用程序。
服务器应用程序所做的工作是:
在Java中,这是非常容易的。我创建一个线程池,然后对每个请求在该池中创建一个线程。该线程将运行计算任务。这在Java中是成熟的,它可以利用16个cpu内核。我说的对吗?
所以我的问题是:我能在OCaml做同样的事情吗?
发布于 2013-05-15 13:15:55
您所举的并行服务器示例就是使用fork的简单多处理模型很好地解决了这些令人尴尬的并行问题之一。这在OCaml中已经做了几十年了,是的,如果您需要的话,您将使用机器的所有内核进行几乎线性的加速比。
要使用标准库的简单原语,请参阅联机书“UnixSystemProgramingin本章”(2003年首次发布)和/或“用OCaml开发应用程序”(2000年首次发布)的本章。
您还可能希望使用更高级别的库,例如rafix中提到的Gerd的OCamlnet库,它提供了很多东西,从通常的客户机/服务器设计的直接助手到底层的多进程通信库;参见文献资料。
库帕图也很有趣,但是对于稍微不同的用例(更重要的是,您有大量的数据同时可用,您希望使用相同的函数并行处理):并行计算的Array.map或List.map (或fold)的插入重构。
发布于 2013-05-15 10:52:05
最接近真实(先发制人)线程的东西是内置的线程库。这意味着您的编程模型将是相同的,但是有两个重要的区别:
这使得OCaml的线程对于并发性或并行性来说都是一个非常糟糕的解决方案,因此一般人都避免使用它们。但它们仍然有它们的用途。
Lwt和异步非常相似,为您提供了一种不同的线程风格--合作风格。协作线程不同于抢占线程,因为线程之间的上下文切换在代码中是显式的,阻塞调用总是明显的类型签名。所提供的协作线程非常便宜,非常适合并发,但同样不会帮助您实现并行(由于OCaml的运行时的限制)。
有关合作线程的良好介绍,请参阅以下内容:http://janestreet.github.io/guide-async.html
编辑:对于您的特定场景,我将使用Parmap,如果任务像您的示例那样计算密集,那么从parmap启动进程的开销应该可以忽略不计。
https://stackoverflow.com/questions/16562394
复制相似问题