|
1
10
性能: 可能不会。OCaml的线程不提供并行执行,它们只是构造程序的一种方法。OCaml运行时本身不是线程安全的,因此唯一可能与单个OCaml线程并行执行的代码是接口C代码(没有对OCaml的回调!)。 在实现方面,运行时有一个mutex,在调用阻塞C原语时释放,也可以在调用执行重要工作的C函数时释放。 易于实施: 这不会改变世界。您将拥有OCaml的舒适性和类似pthread的库。如果您正在寻找新的东西来发现,同时利用您所学到的OCaml,我推荐您 Jocaml . 它与OCaml同步或不同步,但最近有一个(重新)重新实现,即使它稍微不同步,也很有趣,是并发程序的一个全新视角。
|
|
|
2
8
OCaml非常适合于编写网络服务器,尽管Pascal观察到线程有一些限制。
不过,幸运的是,线程并不是组织这样一个程序的唯一方法。这个
Lwt
读取和写入都发生在主事件循环中,但是您可以避免正常的“读取,完成后调用此函数”手动开销。 |
|
|
3
3
你说“真的很典型,比如每个客户机有一个线程”,但每个客户机有一个操作系统线程是一个错误 非常糟糕的设计 . 线程很重,创建和销毁需要很长时间,仅线程堆栈就消耗了~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
OCaml对于网络应用程序来说非常有用,只要您可以同时使用相对较少数量的活动线程(比如不超过100个线程)。您可以将mladuck作为一个示例,尽管它是在客户机空间中,而不是在服务器空间中。 |
|
|
5
-2
|