2013-05-02 35 views
11

似乎很多人都说OCaml并不具备良好的并发能力,并且它也不适合Web服务器应用程序。我正在学习ocaml's manual。看来OCaml现在提供了并发性。为什么OCaml的线程被认为是“不够”?

我可以知道为什么OCaml的并发/线程被认为是不好的?

我可以在OCaml中开发服务器应用程序吗?我可能遇到什么问题?

回答

14

请参阅Concurrency vs. parallelism — What's the difference?。 OCaml的线程提供并发性,因为您可以在上一个函数完成之前启动下一个函数。但OCaml不提供并行性,所以当第二个函数启动时,第一个函数必须暂停。两个线程不能同时运行,因此一个进程中的多个CPU限制计算会相互阻塞,并且不能在一个进程中最大化所有CPU内核。

这是人们用OCaml穿线的牛肉。这是否意味着你不能使用OCaml作为服务器之类的东西?不是的。这是你在服务器设计中必须考虑的事情,但它通常不是一个炫耀者。哎呀,Node.js是直接单线程的,但其主要目的是创建服务器。

+2

呵呵,Node.js是单线程的?但是Node.js如何利用多个cpu? – 2013-05-02 18:27:18

+4

@JacksonTale:您运行一个Node进程集群以充分利用多个CPU内核。 – Chuck 2013-05-02 18:34:12

+1

好,现在明白了。但是对于那个节点进程集群,它们每个都占用一个端口?那里有负载平衡器?你能告诉我这个建筑的设计吗? – 2013-05-02 19:46:26

8

OCaml支持使用多个线程。但是只有一个ocaml线程可以在给定的时间点运行,不会有不同ocaml线程的相关性。

但是:

  • 你可以fork /使用多个进程。只要它们与ocaml运行时的交互被正确控制,外部代码(例如,外部c/C++库)就可以并行运行。

PS:链接文档不是ocaml手册。这本关于OCaml的书很好,但过时了。

附录: 当然,您可以在ocaml中开发服务器(现场示例:ocsigen - a web server)。 这取决于你的需求,如果缺乏真正的线程concurreny是一个功能或缺点。

相关问题