要做个 http 网页爬虫工具,因此想找个轻量级的并发框架参考学习,目前我知道的 rainbows 和 celluloid,但由于 ruby 属于半吊子,所以想多听听大家的意见。 虽然自己写了一个多线程同步处理的小东西,但是感觉太垃圾了。 另外搭车同问下,为啥有时候 http 请求发出去之后,整个线程就挂起没响应了呢? 使用的 Net::HTTP 的,设置了访问超时什么的都没用。直接整个线程就停滞了
你是如何使用多线程的? 多进程多线程
还是 单进程多线程
推荐使用 多进程多线程模式
.单进程多线程模式
.多进程多线程
和 单进程多线程
最终可以实现相同并发量,只是前者占用了核数倍内存,但是后者只有 1 倍。
具体使用经验不是很多,没有具体 gem 推荐,不好意思。
同样推荐 concurrent-ruby。并发 HTTP 请求的情况属于 Ruby 内部进行 IO 操作,这种情况不会触发 GIL。你可以看看 concurrent-ruby 里面的 Future 和 Workflow,方便组织代码。不过如果要做一些限制(比如最多并发 10 条 HTTP 请求)那就要再想想了,也许需要用到 ThreadPool。
#3 楼 @small_fish__ 感谢 线程挂起是导致进程下所有的线程都停滞了,当然也有可能是所有的线程都在等待 IO,但这样就不合理了。 没可能所有的 HTTP 请求都一直等待响应的,而且设置了请求和读取超时也没有起到作用
Ruby 并行是半吊子,并发可不是。 基于 io 多路复用的 em,或者基于协程的 celluloid 都可以解决你的需求。如果只是简单的采集,用 typhoeus 就够了。
我以前有做過 ruby crawler cluster
,我採用的方式是用 ruby thread
+ typhoeus parallel requests
,由於 typhoeus
底層是調用 libcur
l 所以併發的問題在 typhoeus
底層會處理掉,性能上也比 EM
好多了