2013-05-02 77 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是一個功能或缺點。