代码之家  ›  专栏  ›  技术社区  ›  Jack

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

  •  12
  • Jack  · 技术社区  · 15 年前

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

    提前谢谢

    5 回复  |  直到 15 年前
        1
  •  10
  •   Pascal Cuoq    15 年前

    性能: 可能不会。OCaml的线程不提供并行执行,它们只是构造程序的一种方法。OCaml运行时本身不是线程安全的,因此唯一可能与单个OCaml线程并行执行的代码是接口C代码(没有对OCaml的回调!)。

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

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

        2
  •  8
  •   Michael Ekstrand    15 年前

    OCaml非常适合于编写网络服务器,尽管Pascal观察到线程有一些限制。

    不过,幸运的是,线程并不是组织这样一个程序的唯一方法。这个 Lwt select

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

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

        3
  •  3
  •   J D    7 年前

    你说“真的很典型,比如每个客户机有一个线程”,但每个客户机有一个操作系统线程是一个错误 非常糟糕的设计 . 线程很重,创建和销毁需要很长时间,仅线程堆栈就消耗了~1MB。如果每个连接有一个线程,那么1000个同时进行的客户端连接(这是完全可行的)将只为它们的堆栈消耗1GB的RAM,并且程序的性能(在任何语言中)将受到完成任何工作所需的上下文切换量的限制。您不希望在任何语言(包括C和OCaml)中使用该设计。请注意,这个问题在跟踪垃圾收集语言的上下文中尤其糟糕,因为GC还遍历所有这些线程堆栈,以便在每个GC循环之前整理全局根。我是第一个承认这种反模式在现实世界中无处不在的人,但请不要照搬它!我看到了金融行业的“低延迟”服务器,它们用C++编写,每个连接使用一个线程,它们只从服务这些线程的Windows操作系统中等待六秒的等待时间。

    http://people.eecs.berkeley.edu/~sangjin/2012/12/21/epoll-vs-kqueue.html

    让我们考虑一种有效的设计,比如操作系统内核的epoll或kqueue接口,它提供服务器的代码信息,这些信息涉及传入和传出的数据缓冲区。通过这种设计,单线程服务器可以获得优异的性能。然而,典型的服务器在每个客户机上都有序列化工作要做,而一些核心工作通常是在所有客户机连接上串行执行的。因此,序列化和反序列化可以并行化,但核心服务器操作不能。在这种情况下,OCaml非常适合除序列化层之外的所有方面,因为它对并行性的支持较差。

    我个人为不同行业实现了许多服务器,性能要求千差万别。根据我的经验,OCaml是最好的工具之一,因为它提供了优秀的库(易于使用和可靠)和优秀的串行性能。我遇到的唯一问题是关于序列化层的并行化,但是在实践中,我发现OCaml在Java和.NET等备选方案周围运行,尽管它们可以并行化。我发现典型的延迟是100us(对于.NET)和10us(对于OCaml)。

    http://prl.ccs.neu.edu/blog/2016/05/24/measuring-gc-latencies-in-haskell-ocaml-racket/

        4
  •  2
  •   Norman Ramsey    15 年前

    OCaml对于网络应用程序来说非常有用,只要您可以同时使用相对较少数量的活动线程(比如不超过100个线程)。您可以将mladuck作为一个示例,尽管它是在客户机空间中,而不是在服务器空间中。

        5
  •  -2
  •   Demi    9 年前

    推荐文章