2012-11-13 56 views
2

所以我们可以说我有一个sidekiq进程发送一个我不想等待的http post请求。我不希望这会成为工人速度的阻挡者。在Sidekiq工作人员中使用Eventmachine http请求

一个想法我就是用这个简单的示例代码EventMachine的HTTP请求

EventMachine.run do 
    http = EventMachine::HttpRequest.new("http://www.example.com").post :options => {...} 
    http.callback do 
     puts "got a response" 
     puts http.response 
     EventMachine.stop 
    end 
    puts "worker finished" 
    end 

所以让我们假设我的工作进程完成回调被调用之前。这里会发生什么?这是否意味着回拨指针将失败?我想了解这里的控制流程。

回答

2

根据你所需要的:

  1. 你想利用CPU
    Sidekiq工人是非常轻巧。在等待响应时,您可以运行更多的CPU以利用CPU。
  2. 你想让工作人员更快完成
    您可以将不同工作人员处理的每个请求排入队列。它将像EM中的next_tick()一样。 我对Sidekiq和Celluloid感到兴奋,因为它改变了我们的思维方式。 http://www.slideshare.net/KyleDrake/hybrid-concurrency-patterns?utm_source=rubyweekly&utm_medium=email
+0

谢谢,我也很喜欢sidekiq,但遇到工人死亡时没有错误的问题。我认为它可能与非线程安全代码有关,但首先看起来很好。 –

2

EventMachine.run块将不会返回,直到您拨打EventMachine.stop。所以,就你的情况而言,如果没有正在运行的回调,工人将无法完成。

+0

所以有什么办法可以做到这一点,这将允许工作人员完成并仍然异步地发布http请求。 –

+0

这将是你的例子的行为,只是它会在结束之前输出“worker finished”,因为你的'puts'在'run'块内。 –

相关问题