我在Node.js中编写了这个Web爬虫.我喜欢使用Ruby,所以我在EventMachine中重写了它.由于原版是在CoffeeScript中,它实际上非常容易,并且代码非常相似,除了在EventMachine中我实际上可以捕获并从异常中恢复(因为我使用的是光纤).
问题是在Node.js代码上运行不到20秒的测试在EventMachine上占用的时间超过5分钟.当我观察连接计数时,它几乎看起来甚至没有并行运行(它们排队成数百个,然后非常缓慢地向下运行),尽管日志记录显示代码点是并行命中的.
我意识到没有代码就无法确切地知道到底发生了什么,但我只是想知道是否存在某种潜在的差异,我应该放弃,或者他们是否应该能够以更快的速度运行(a小的减速是好的)我应该继续试图找出问题所在.
我做了以下,但它似乎没有任何影响:
puts "Running with ulimit: " + EM.set_descriptor_table_size(60000).to_s EM.set_effective_user('nobody') EM.kqueue
哦,我非常确定我在EventMachine中没有任何阻塞调用.我已经梳理了每一行大约10次,寻找任何可能阻塞的东西.我的所有网络调用都是EM :: HttpRequest.
解决方法
The problem is that tests that run in under 20 seconds on the Node.js code take up to and over 5 minutes on EventMachine. When I watch the connection count it almost looks like they are not even running in parallel (they queue up into the hundreds,then very slowly work their way down),though logging shows that the code points are hit in parallel.
如果它们没有并行运行,那么它不是异步的.所以你阻止了.
基本上,您需要弄清楚在标准Ruby库中阻塞IO调用的内容并删除它并将其替换为EventMachine非阻塞IO调用.
您的代码可能没有任何阻止调用,但您使用的是不属于您自己的第三方代码吗?他们可能会阻止.即使像调试打印/日志这样简单的东西也可以阻止.
All my network calls are EM::HttpRequest.
怎么样的文件IO,TCP怎么样?什么其他可以阻止的东西呢.第三方图书馆怎么样?
我们真的需要在这里看到一些代码.要么在代码中识别瓶颈,要么阻止调用.
node.js不应该比EM快一个数量级.