至少在我的具体情况下。此处不作一般性陈述。
我有这个用 Node.js 编写的网络爬虫。我很想改用 Ruby,所以我在 EventMachine 中重新编写了它。由于原始版本是在 CoffeeScript 中,它实际上非常简单,而且代码非常相似,除了在 EventMachine 中我实际上可以捕获异常并从异常中恢复(因为我使用的是 Fiber)。
问题在于,在 Node.js 代码上运行不到 20 秒的测试在 EventMachine 上运行时间长达 5 分钟或超过 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。