首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Celluloid从线程池运行HTTP请求?

如何使用Celluloid从线程池运行HTTP请求?
EN

Stack Overflow用户
提问于 2013-02-12 15:18:39
回答 1查看 886关注 0票数 2

我正在使用Ruby1.9.3,并在MacOSX10.7上进行测试。

我有一个Sender类,它应该向某个URL发送请求:

代码语言:javascript
复制
require "celluloid"
require "curb"

class Sender
  include Celluloid

  def send(msg)    
    Curl.get($URL) do |url|
      url.headers["content-type"] = "text/html;charset=utf-8"
    end
  rescue Exception => e
    $LOG.error "[erro]-> [ #{e.message} "
  end
end

我有另一个进程,它应该接收来自RabbitMQ队列的消息,并使用Sender发送请求。

代码语言:javascript
复制
 AMQP.start(:host => $AMQP_URL) do |connection|
   @channel ||= AMQP::Channel.new(connection)
   @queue   ||= @channel.queue("results")

   pool = Sender.pool

   @queue.subscribe do |metadata, body|
      msg = MessagePack.unpack(body)        
      pool.send(msg)
  end
 end

当我运行它时,我得到:

代码语言:javascript
复制
15:56:59 results.1    | I, [2013-02-12T15:56:59.422192 #44490]  INFO -- : Terminating 5 actors...
15:56:59 results.1    | E, [2013-02-12T15:56:59.422640 #44490] ERROR -- : Celluloid::PoolManager crashed!
15:56:59 results.1    | NoMethodError: undefined method `each' for nil:NilClass
15:56:59 results.1    | /Users/info/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/gems/1.9.1/gems/facter-1.6.13/lib/facter/macosx.rb:39:in `<top (required)>'
15:56:59 results.1    | /Users/info/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/gems/1.9.1/gems/facter-1.6.13/lib/facter/util/loader.rb:81:in `load'
15:56:59 results.1    | /Users/info/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/gems/1.9.1/gems/facter-1.6.13/lib/facter/util/loader.rb:81:in `load_file'
15:56:59 results.1    | /Users/info/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/gems/1.9.1/gems/facter-1.6.13/lib/facter/util/loader.rb:43:in `block (2 levels) in load_all'
15:56:59 results.1    | /Users/info/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/gems/1.9.1/gems/facter-1.6.13/lib/facter/util/loader.rb:38:in `each'
15:56:59 results.1    | /Users/info/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/gems/1.9.1/gems/facter-1.6.13/lib/facter/util/loader.rb:38:in `block in load_all'
15:56:59 results.1    | /Users/info/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/gems/1.9.1/gems/facter-1.6.13/lib/facter/util/loader.rb:35:in `each'
15:56:59 results.1    | /Users/info/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/gems/1.9.1/gems/facter-1.6.13/lib/facter/util/loader.rb:35:in `load_all'
15:56:59 results.1    | /Users/info/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/gems/1.9.1/gems/facter-1.6.13/lib/facter/util/collection.rb:72:in `fact'
15:56:59 results.1    | /Users/info/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/gems/1.9.1/gems/facter-1.6.13/lib/facter.rb:94:in `block (2 levels) in singletonclass'
15:56:59 results.1    | /Users/info/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/gems/1.9.1/gems/celluloid-0.12.3/lib/celluloid.rb:37:in `cores'
15:56:59 results.1    | /Users/info/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/gems/1.9.1/gems/celluloid-0.12.3/lib/celluloid/pool_manager.rb:12:in `initialize'
15:56:59 results.1    | /Users/info/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/gems/1.9.1/gems/celluloid-0.12.3/lib/celluloid/calls.rb:57:in `dispatch'
15:56:59 results.1    | /Users/info/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/gems/1.9.1/gems/celluloid-0.12.3/lib/celluloid/actor.rb:323:in `block in handle_message'
15:56:59 results.1    | /Users/info/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/gems/1.9.1/gems/celluloid-0.12.3/lib/celluloid/tasks/task_fiber.rb:22:in `block in initialize'
15:56:59 results.1    | E, [2013-02-12T15:56:59.423117 #44490] ERROR -- : Celluloid::PoolManager#finalize crashed!
15:56:59 results.1    | NoMethodError: undefined method `+' for nil:NilClass
15:56:59 results.1    | /Users/info/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/gems/1.9.1/gems/celluloid-0.12.3/lib/celluloid/pool_manager.rb:26:in `finalize'
15:56:59 results.1    | /Users/info/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/gems/1.9.1/gems/celluloid-0.12.3/lib/celluloid/actor.rb:376:in `block in run_finalizer'
15:56:59 results.1    | /Users/info/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/gems/1.9.1/gems/celluloid-0.12.3/lib/celluloid/tasks/task_fiber.rb:22:in `block in initialize'
15:56:59 results.1    | I, [2013-02-12T15:56:59.424508 #44490]  INFO -- : Shutdown completed cleanly
15:56:59 results.1    | /Users/info/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/gems/1.9.1/gems/facter-1.6.13/lib/facter/macosx.rb:39:in `<top (required)>': undefined method `each' for nil:NilClass (NoMethodError)
15:56:59 results.1    |   from /Users/info/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/gems/1.9.1/gems/facter-1.6.13/lib/facter/util/loader.rb:81:in `load'
15:56:59 results.1    |     from /Users/info/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/gems/1.9.1/gems/facter-1.6.13/lib/facter/util/loader.rb:81:in `load_file'
15:56:59 results.1    |     from /Users/info/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/gems/1.9.1/gems/facter-1.6.13/lib/facter/util/loader.rb:43:in `block (2 levels) in load_all'
15:56:59 results.1    |     from /Users/info/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/gems/1.9.1/gems/facter-1.6.13/lib/facter/util/loader.rb:38:in `each'
15:56:59 results.1    |     from /Users/info/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/gems/1.9.1/gems/facter-1.6.13/lib/facter/util/loader.rb:38:in `block in load_all'
15:56:59 results.1    |     from /Users/info/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/gems/1.9.1/gems/facter-1.6.13/lib/facter/util/loader.rb:35:in `each'
15:56:59 results.1    |     from /Users/info/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/gems/1.9.1/gems/facter-1.6.13/lib/facter/util/loader.rb:35:in `load_all'
15:56:59 results.1    |     from /Users/info/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/gems/1.9.1/gems/facter-1.6.13/lib/facter/util/collection.rb:72:in `fact'
15:56:59 results.1    |     from /Users/info/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/gems/1.9.1/gems/facter-1.6.13/lib/facter.rb:94:in `block (2 levels) in singletonclass'
15:56:59 results.1    |     from /Users/info/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/gems/1.9.1/gems/celluloid-0.12.3/lib/celluloid.rb:37:in `cores'
15:56:59 results.1    |     from /Users/info/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/gems/1.9.1/gems/celluloid-0.12.3/lib/celluloid/pool_manager.rb:12:in `initialize'
15:56:59 results.1    |     from /Users/info/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/gems/1.9.1/gems/celluloid-0.12.3/lib/celluloid/calls.rb:57:in `dispatch'
15:56:59 results.1    |     from /Users/info/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/gems/1.9.1/gems/celluloid-0.12.3/lib/celluloid/actor.rb:323:in `block in handle_message'
15:56:59 results.1    |     from /Users/info/.rvm/rubies/ruby-1.9.3-p194/lib/ruby/gems/1.9.1/gems/celluloid-0.12.3/lib/celluloid/tasks/task_fiber.rb:22:in `block in initialize'
15:56:59 results.1    | exited with code 1

因为池管理器,我是否做错了什么让进程崩溃的事情?

EN

回答 1

Stack Overflow用户

发布于 2013-05-07 20:57:54

您的答案在卷轴中得到了否定的演示。特别是在它的Rack处理程序中。你可以从这里潜入,然后从那里逆向工程你需要的一切:

Reel是一个非常棒的演示,它展示了Celluloid(::IO)的功能,以及你想要的东西.除非是相反的。它通过一个池接收请求,这是你的情况的否定。

正如你所知道的,主要的事情是你在和PoolManager说话,而不是任何一个演员。这是你可以重新思考你的方法的主要部分。考虑到这一点,重构:

代码语言:javascript
复制
Celluloid::Actor[:reel_rack_pool] = ::Reel::RackWorker.pool(size: options[:workers], args: [self])
    ::Reel::Server.supervise_as(:reel_server, options[:host], options[:port]) do |connection|
    Celluloid::Actor[:reel_rack_pool].handle(connection.detach)
end

一旦考虑到这些代码,可以随时用新的错误或问题来更新您的问题。你肯定会得到关于#赛洛伊德的帮助(IRC)和/或在细胞的邮件列表中,它是非常活跃和充满敬业和知识丰富的人,他们真的欢迎那些不习惯赛勒洛德的人。

  • http://groups.google.com/group/celluloid-ruby
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14835754

复制
相关文章

相似问题

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