2012-11-13 54 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'塊內。 –

相關問題