2010-07-14 69 views
10

我在想,如果OCaml在多線程環境下通過TCP處理典型的客戶端/服務器交互時,性能和易用性方面是否會表現良好,我的意思是像每個客戶端有一個接收數據的線程,操作遊戲狀態的變化並將它們發回給客戶。OCaml適合編寫網絡服務器嗎?

這是因爲我需要爲遊戲編寫一個服務器,而且我總是在C中做這些事情,但是現在我知道OCaml,我很想知道它是否可以,或者我會發現自己試圖解決在一個典型的語言問題,不合身的..

在此先感謝

回答

10

性能:可能不會。 OCaml的線程不提供並行執行,它們只是構建程序的一種方式。 OCaml運行時本身並不是線程安全的,因此唯一可能在單個OCaml線程中並行執行的代碼將是接口C代碼(不包括OCaml回調!)。

實現明智的,有在運行時,調用阻斷C原語時被釋放一個互斥體,並調用C函數做顯著工作的時候也被釋放。

易於實現的:它不會改變世界的。你會有舒適的OCaml和旁邊的一個線程庫。如果你正在尋找新的東西來發現,同時利用你所學到的OCaml,我推薦Jocaml。它與OCaml進入和退出同步,但是最近有一個(重新)重新實現,即使它稍微不同步,它也非常有趣,並且是併發程序的全新視角。

Jocaml上的OCaml的基礎上實現的。與運行時不同步的是,我幾乎可以肯定它使用單獨的進程和消息傳遞。但是對於你提到的應用程序應該可以做得很好。

+3

JoCaml提供了一個基於消息傳遞給程序員的(非常好的)併發模型。您的基本JoCaml程序在單個Caml運行時中運行;在引擎蓋下,消息在該運行時的線程之間發送。 JoCaml還爲分佈式編程提供了便利:消息可以在運行時之間透明地發送,甚至不需要在同一臺機器上運行。如果你使用這個,那麼運行時碰巧在同一臺機器上運行的特殊情況並沒有特別的利用。 – Gilles 2010-07-16 20:33:49

2

OCaml將很適合網絡應用程序,只要您可以同時使用相對較少數量的活動線程—說不超過100.您可以將MLdonkey作爲示例,儘管在客戶端空間中不是在服務器空間。

8

OCaml中是相當適合編寫網絡服務器,儘管帕斯卡指出,有穿線限制。

不過還好,穿不組織這樣一個程序的唯一途徑。庫(輕量級線程)提供了異步I/O的抽象,非常容易使用(尤其是在結合一些語法支持的情況下)。實際上所有東西都在一個線程中運行,但它都是由一個異步I/O循環驅動的(建立在Unix的select調用上),編程風格允許你編寫看起來像直接代碼的代碼(避免了很多正常的代碼開銷異步I/O在許多其他語言)。例如:

lwt my_message = read_message socket in 
let repsonse = compute_response my_message in 
send_response socket response 

無論是讀取和寫入發生回到主事件循環,但你避免正常的「讀,調用這個函數當你完成」手冊開銷。

0

,如果你想使用多線程搶佔哈斯克爾將是一個更好的選擇。 GHC可以支持大量的線程,並且可以在多核系統上並行運行。 OCaml傾向於合作多線程和多進程。

+0

這只是意見。 Ocisgen與cohttp一起存在。 – 2016-01-22 14:28:49

+0

@Edgar查看編輯 – Demi 2016-01-22 17:13:56