首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >红宝石和Celluloid

红宝石和Celluloid
EN

Stack Overflow用户
提问于 2012-09-06 00:14:44
回答 1查看 2.5K关注 0票数 5

由于一些限制,我想将我当前的项目从EventMachine/EM-Synchrony切换到Celluloid,但我在接触它时遇到了一些麻烦。我正在编码的项目是一个网络收割机,应该爬行吨的页面尽可能快。

为了基本了解Celluloid,我在本地web服务器上生成了10.000个虚拟页面,并希望通过这个简单的Celluloid代码片段来抓取它们:

代码语言:javascript
复制
#!/usr/bin/env jruby --1.9

require 'celluloid'
require 'open-uri'

IDS = 1..9999
BASE_URL = "http://192.168.0.20/files"

class Crawler
  include Celluloid
  def read(id)
    url = "#{BASE_URL}/#{id}"
    puts "URL: " + url
    open(url) { |x| x.read }
  end
end

pool = Crawler.pool(size: 100)

IDS.to_a.map do |id|
   pool.future(:read, id)
end

根据我对Celluloid的理解,期货是获取触发请求的响应的方法(类似于EventMachine中的回调),对吧?另一件事是,每个参与者都在自己的线程中运行,所以我需要对请求进行某种批处理,因为10.000个线程会在我的OSX开发机器上导致错误。

所以创建一个池是可行的,对吧?但是:上面的代码遍历9999个URL,但只有1300个HTTP请求被发送到web服务器。因此,限制请求并遍历所有URL会出现问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-06 01:13:04

很可能你的程序在你所有的未来都创建好后就退出了。使用Celluloid,一个未来将开始执行,但在你对未来对象调用#value之前,你不能保证它完成。这也适用于池中的期货。您需要做的可能是将其更改为如下所示:

代码语言:javascript
复制
  crawlers = IDS.to_a.map do |id|
    begin
      pool.future(:read, id)
    rescue DeadActorError, MailboxError
    end
  end

  crawlers.compact.each { |crawler| crawler.value rescue nil }
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12285639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档