Ruby 有什么轻量级的并发框架推荐吗?

nameofhsw · 2016年03月26日 · 最后由 nickhsu 回复于 2016年03月30日 · 4223 次阅读

要做个 http 网页爬虫工具,因此想找个轻量级的并发框架参考学习,目前我知道的 rainbows 和 celluloid,但由于 ruby 属于半吊子,所以想多听听大家的意见。 虽然自己写了一个多线程同步处理的小东西,但是感觉太垃圾了。 另外搭车同问下,为啥有时候 http 请求发出去之后,整个线程就挂起没响应了呢? 使用的 Net::HTTP 的,设置了访问超时什么的都没用。直接整个线程就停滞了

1 楼 已删除

EM-Synchrony EM-HTTP-Request 方法会快很多

你是如何使用多线程的? 多进程多线程 还是 单进程多线程

  1. 首先,网络访问属于 io 操作,会释放 cpu, 单个线程会挂起,但是不会妨碍其他线程,所以正常情况其他线程也会进行操作,唯一可能就是全部都在等待 IO, 有可能对方相应太慢。
  2. 因为有 GIL 存在,单进程只能使用一个 cpu,无法使用多核 cpu, 在这种情况下,推荐使用 多进程多线程模式.
  3. 如果你有办法去除 GIL,那么你可以使用单进程多线程模式.

多进程多线程单进程多线程 最终可以实现相同并发量,只是前者占用了核数倍内存,但是后者只有 1 倍。

具体使用经验不是很多,没有具体 gem 推荐,不好意思。

同样推荐 concurrent-ruby。并发 HTTP 请求的情况属于 Ruby 内部进行 IO 操作,这种情况不会触发 GIL。你可以看看 concurrent-ruby 里面的 Future 和 Workflow,方便组织代码。不过如果要做一些限制(比如最多并发 10 条 HTTP 请求)那就要再想想了,也许需要用到 ThreadPool。

9 楼 已删除

#3 楼 @small_fish__ 感谢 线程挂起是导致进程下所有的线程都停滞了,当然也有可能是所有的线程都在等待 IO,但这样就不合理了。 没可能所有的 HTTP 请求都一直等待响应的,而且设置了请求和读取超时也没有起到作用

Ruby 并行是半吊子,并发可不是。 基于 io 多路复用的 em,或者基于协程的 celluloid 都可以解决你的需求。如果只是简单的采集,用 typhoeus 就够了。

我以前有做過 ruby crawler cluster,我採用的方式是用 ruby thread + typhoeus parallel requests,由於 typhoeus 底層是調用 libcurl 所以併發的問題在 typhoeus 底層會處理掉,性能上也比 EM 好多了

需要 登录 后方可回复, 如果你还没有账号请 注册新账号