Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 在Sidekiq worker中使用Eventmachine http请求_Ruby_Sinatra_Eventmachine_Sidekiq - Fatal编程技术网

Ruby 在Sidekiq worker中使用Eventmachine http请求

Ruby 在Sidekiq worker中使用Eventmachine http请求,ruby,sinatra,eventmachine,sidekiq,Ruby,Sinatra,Eventmachine,Sidekiq,假设我有一个sidekiq进程,它发送一个我不想等待的httppost请求。我不希望这成为阻碍工人速度的因素 我的一个想法是将这个简单的示例代码用于EventMachine Http请求 EventMachine.run do http = EventMachine::HttpRequest.new("http://www.example.com").post :options => {...} http.callback do puts "got a re

假设我有一个sidekiq进程,它发送一个我不想等待的httppost请求。我不希望这成为阻碍工人速度的因素

我的一个想法是将这个简单的示例代码用于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

因此,假设我的工作进程在调用回调之前完成。这里会发生什么?这是否意味着指向回调的指针将失败?我想了解这里的控制流程

在调用
EventMachine.stop
之前,
EventMachine.run
块不会返回。因此,在您的情况下,如果不运行回调,工作进程将无法完成。

调用
EventMachine.run
块将不会返回,直到您调用
EventMachine.stop
。因此,在您的情况下,如果不运行回调,工作进程将无法完成。

取决于您需要什么:

  • 您想利用CPU
    Sidekiq工人非常轻。在等待响应时,您可以运行更多的程序来利用CPU
  • 您希望员工更快地完成工作 您可以将每个请求排队,以便由不同的工作者处理。这就像EM中的下一个_tick()。 我对Sidekiq和赛璐珞很兴奋,因为它改变了我们的思维方式
    根据您的需要:

  • 您想利用CPU
    Sidekiq工人非常轻。在等待响应时,您可以运行更多的程序来利用CPU
  • 您希望员工更快地完成工作 您可以将每个请求排队,以便由不同的工作者处理。这就像EM中的下一个_tick()。 我对Sidekiq和赛璐珞很兴奋,因为它改变了我们的思维方式
    那么,有没有什么方法可以让worker完成并仍然异步发布http请求。这就是您的示例的行为,只是它会在完成之前输出“worker finished”,因为您的
    put
    位于
    run
    块内。因此,有没有任何方法可以让工作进程完成并仍然异步发布http请求。这将是您的示例的行为,只是它将在完成之前输出“worker finished”,因为您的
    put
    位于
    run
    块内。谢谢,我也喜欢sidekiq,但是遇到了工人无误死亡的问题。我认为这可能与非线程安全的代码有关,但乍看起来似乎还不错。谢谢,我也喜欢sidekiq,但遇到了工人死而无憾的问题。我认为这可能与非线程安全代码有关,但乍一看似乎还不错。