彗星的最佳途径?(非阻塞IO与Erlang)

彗星的最佳途径?(非阻塞IO与Erlang),erlang,comet,nonblocking,libevent,Erlang,Comet,Nonblocking,Libevent,也许这个问题回答起来并不是那么简单。。。但你的看法是什么?我应该使用非阻塞方法(例如libevent)还是使用erlang轻量级进程来: 在给定的RAM量下实现尽可能多的连接 在给定的CPU量下实现尽可能多的吞吐量 背景是,我计划为发布/订阅服务器编写代码,但我无法决定应该使用哪种方法。在幕后,Erlang VM使用非阻塞IO。如果使用Erlang轻量级进程块,VM实际上不会执行内核级线程上下文切换。大多数情况下,它只会唤醒同一OS线程上的另一个LWP(因此,它不是正确意义上的“阻塞”) 您甚至

也许这个问题回答起来并不是那么简单。。。但你的看法是什么?我应该使用非阻塞方法(例如libevent)还是使用erlang轻量级进程来:

  • 在给定的RAM量下实现尽可能多的连接
  • 在给定的CPU量下实现尽可能多的吞吐量

  • 背景是,我计划为发布/订阅服务器编写代码,但我无法决定应该使用哪种方法。

    在幕后,Erlang VM使用非阻塞IO。如果使用Erlang轻量级进程块,VM实际上不会执行内核级线程上下文切换。大多数情况下,它只会唤醒同一OS线程上的另一个LWP(因此,它不是正确意义上的“阻塞”)


    您甚至可以使用+A参数启动vm,并指定要分配多少IO事件循环线程(AFAIK,Node.js仍然是单线程的,如果回调函数挂起,我们的vm就完成了)

    一篇关于使您可以在那里阅读的文章。但我认为稳定性、灵活性和可维护性在大多数情况下更为重要。记住这一点,除了Erlang,我不会考虑其他任何事情,即使会有一些性能更好的解决方案。

    我已经知道这篇文章,他所取得的成就真是令人惊讶。我也知道Erlang(热交换、可伸缩性等)的优点,但我的最高优先级是性能和每个连接的Ram,我的“感觉”告诉我,使用一个单事件循环(libevent)哪个处理所有连接比为每个连接生成Erlang进程更好?如果每次接收事件时都生成一个进程来处理它,那么使用单事件循环有什么意义?如果不这样做,那么您就有了单线程应用程序(嗯,几乎系统进程仍然是多线程的),在多核机器上性能可能会受到影响。@Filipe Santos:即使您使用单事件循环,您也必须保持每个连接的某种状态。此状态所使用的RAM量将与一个Erlang进程所消耗的内存量相当(肯定不会少几个数量级)。但您将获得多核支持、更快的开发等等。我会制作Erlang POC,然后测量,然后优化,然后将部分重写为NIF,然后再次测量,然后重写为自己的事件循环,然后。。。我打赌你会对Erlang POC感到满意,并将精力集中到特性上。