OCaml是否适合编写网络服务器?

Jac*_*ack 12 networking ocaml tcp

我想知道OCaml在性能和易于实现方面是否表现良好,同时在多线程环境中处理TCP上的典型客户端/服务器交互.我的意思是一些非常典型的东西,例如每个客户端有一个线程接收数据,操作变化在游戏状态并将它们发回给客户.

这是因为我需要为游戏编写一个服务器而且我总是在C中做这些事情但是从现在开始我知道OCaml我很想知道它是否可以,或者我会发现自己试图解决一个典型的问题.语言不适合..

提前致谢

Pas*_*uoq 10

表现:可能不是.OCaml的线程不提供并行执行,它们只是构建程序的一种方式.OCaml运行时本身不是线程安全的,因此唯一可能并行执行单个OCaml线程的代码就是接口C代码(没有回调到OCaml!).

实现方面,运行时有一个互斥锁,它在调用阻塞C原语时释放,也可以在调用执行重要工作的C函数时释放.

易于实施:它不会改变世界.您将拥有OCaml的舒适感和侧面的类似pthread的库.如果您正在寻找新的东西,同时利用您对OCaml的了解,我推荐Jocaml.它与OCaml同步,但最近有一个(重新)重新实现,即使它稍微不同步,它也很有趣,并且是并发程序的全新视角.

Jocaml是在OCaml之上实现的.什么与运行时不兼并和所有,我几乎可以肯定它使用单独的进程和消息传递.但对于你提到的应用程序,它应该能够做得很好.

  • JoCaml提供了一个(非常好的)并发模型,它基于传递给程序员的消息.您的基本JoCaml程序在单个Caml运行时中运行; 在引擎盖下,消息在该运行时的线程之间发送.JoCaml还提供分布式编程功能:消息可以在运行时之间透明地发送,甚至不需要在同一台机器上运行.如果使用它,则不会特别利用运行时碰巧在同一台机器上运行的特殊情况. (3认同)

Mic*_*and 9

OCaml非常适合编写网络服务器,尽管Pascal观察到,线程存在限制.

但幸运的是,线程并不是组织这样一个程序的唯一方法.的LWT库(用于轻量线程)提供异步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
Run Code Online (Sandbox Code Playgroud)

读取和写入都发生在主事件循环中,但是您可以避免正常的"读取,在完成时调用此函数"手动开销.