为什么EventMachine比Node慢得多?

| 至少在我的情况下。在这里不做一般性陈述。 我已经在Node.js中编写了这个网络爬虫。我想改用Ruby,因此在EventMachine中重新编写了它。由于原始文档位于CoffeeScript中,因此实际上非常容易,并且代码几乎相同,除了在EventMachine中,我实际上可以捕获异常并从异常中恢复(因为我使用的是光纤)。 问题在于,在Node.js代码上不到20秒运行的测试在EventMachine上可能要花费5分钟以上的时间。当我看到连接计数时,几乎看上去它们甚至没有并行运行(它们排成一排,成百上千,然后非常缓慢地向下运行),尽管日志记录显示代码点是并行命中的。 我意识到,没有代码,您将无法真正知道到底发生了什么,但是我只是想知道是否存在某种潜在的差异,我应该放弃,或者它们是否真的应该能够以同样快的速度运行(稍慢一点就可以了),我应该继续尝试找出问题所在。 我做了以下工作,但实际上似乎没有任何作用:
puts \"Running with ulimit: \" + EM.set_descriptor_table_size(60000).to_s
EM.set_effective_user(\'nobody\')
EM.kqueue
哦,我非常确定EventMachine中没有任何阻塞调用。我已经在每一行中梳理了大约10次,以查找可能阻塞的任何内容。我所有的网络呼叫都是EM :: HttpRequest。     
已邀请:
  问题在于,在Node.js代码上不到20秒运行的测试在EventMachine上可能要花费5分钟以上的时间。当我看到连接计数时,几乎看上去它们甚至没有并行运行(它们排成一排,成百上千,然后非常缓慢地向下运行),尽管日志记录显示代码点是并行命中的。 如果它们不是并行运行的,则说明它不是异步的。因此,您正在阻止。 基本上,您需要弄清楚您在标准Ruby库中进行了哪些阻塞IO调用,并将其删除,然后将其替换为EventMachine非阻塞IO调用。 您的代码可能没有任何阻止呼叫,但您是否使用的不是来自或不是来自or1 or的第三方代码?它们可能会阻塞。甚至像调试打印/日志这样的简单操作也可能会阻塞。   我所有的网络呼叫都是EM :: HttpRequest。 那么文件IO呢,TCP呢?还有什么会阻塞的呢?第三党图书馆呢? 我们真的需要在这里看到一些代码。在代码中识别瓶颈或阻止调用。 node.js的速度不应比EM快一个数量级。     

要回复问题请先登录注册