首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该在Goliath中使用EM::Synchrony::Multi还是EM::Synchrony::FiberIterator?

我应该在Goliath中使用EM::Synchrony::Multi还是EM::Synchrony::FiberIterator?
EN

Stack Overflow用户
提问于 2012-09-22 00:19:25
回答 1查看 494关注 0票数 0

也许这是一种错误的方法,但我是trying to parallelize em-hiredis使用EM::Synchrony::MultiEM::Synchrony::FiberIterator在巨人中进行放置和查找。但是,我似乎无法访问基本值initialized in the config。我一直收到method_missing错误。

这是我正在尝试做的事情的基本淡化版本:

代码语言:javascript
复制
/lib/config/try.rb

config['redisUri'] = 'redis://localhost:6379/0'
config['redis_db'] ||= EM::Hiredis.connect
config['user_agent'] = "MyCrawler Mozilla/5.0 Compat etc."

下面是Goliath的基本设置

代码语言:javascript
复制
/try.rb

require "goliath"
require "em-hiredis"
require "em-synchrony/fiber_iterator"
require "em-synchrony/em-hiredis"
require "em-synchrony/em-multi"

class Try < Goliath::API
  use Goliath::Rack::Params
  use Goliath::Rack::DefaultMimeType

  def response(env)
    case env['REQUEST_PATH']
    when "/start" then
      start_crawl()
      body = "STARTING"
      [200, {}, body]
    end 
  end 

  def start_crawl
    urls = ["http://www.example.com/",
      "http://www.example.com/photos/",
      "http://www.example.com/video/",
    ]

    EM::Synchrony::FiberIterator.new(urls, 3).each do |url|
      p "#{user_agent}"
      redis_db.sadd 'test_queue', url
    end

    # multi = EM::Synchrony::Multi.new
    # urls.each_with_index do |url, index|
    #  p "#{user_agent}"
    #  multi.add index, redis_db.sadd('test_queue', url)
    # end
  end
end

然而,我一直收到错误,歌利亚不知道在配置中初始化的user_agentredis_db是什么。

代码语言:javascript
复制
[936:INFO] 2012-09-21 23:47:10 :: Starting server on 0.0.0.0:9000 in development mode. Watch out for stones.
/Users/ewu/.rvm/gems/ruby-1.9.3-p194@crawler/gems/goliath-1.0.0/lib/goliath/api.rb:143:in `method_missing': undefined local variable or method `user_agent' for #<Try:0x007ff5a431c4e0 @opts={}> (NameError)
from ./lib/try.rb:27:in `block in start_crawl'
from /Users/ewu/.rvm/gems/ruby-1.9.3-p194@crawler/gems/em-synchrony-1.0.2/lib/em-synchrony/fiber_iterator.rb:10:in `call'
from /Users/ewu/.rvm/gems/ruby-1.9.3-p194@crawler/gems/em-synchrony-1.0.2/lib/em-synchrony/fiber_iterator.rb:10:in `block (2 levels) in each'
...
...
...

理想情况下,我可以让FiberIterator正常工作,因为我有额外的条件需要检查:

代码语言:javascript
复制
EM::Synchrony::FiberIterator.new(urls, 3).each do |new_url}
  is_member = redis_db.sismember('crawled_urls', new_url)
  is_member += redis_db.sismember('queued_urls', new_url)
  if is_member == 0
    redis_db.lpush 'crawl_queue', new_url
    redis_db.sadd 'queued_urls', new_url
  end
end
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-09-22 09:44:54

我不认为你的配置文件被加载了。try.rb的名称需要与配置目录中的robojin.rb文件的名称相匹配。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12534300

复制
相关文章

相似问题

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