并发:: Promise.all?不起作用

时间:2018-03-20 18:15:02

标签: ruby concurrency promise

我在执行所有承诺后试图进行一些计算。但是proc从不打电话:

cbr_promise = Concurrent::Promise.execute { CbrRatesService.call }
bitfinex_promise = Concurrent::Promise.execute { BitfinexService.call }

proc = Proc.new do
  puts 10
end
Concurrent::Promise.all?([cbr_promise, bitfinex_promise]).then { proc }

使用concurrent-ruby gem制作。

我应该创建一个每100毫秒检查一次的循环吗?

更新

我尝试添加一个循环并通过代码编写(在sidekiq worker中):

while @fl
  Concurrent::Promise.all?([cbr_promise, bitfinex_promise]).then { proc }
end

但所有承诺的state都是pending。这可能是因为byebug,但无论如何proc从不打电话。

1 个答案:

答案 0 :(得分:4)

  1. Concurrent::Promise.all?返回Promise,你必须执行它
  2. 您必须将proc作为块参数&proc
  3. 传递
  4. 你必须等待Promises完成(例如睡觉)
  5. 这将有效:

    require 'concurrent'
    
    cbr_promise       = Concurrent::Promise.new { p "cbr" }
    bitfinex_promise  = Concurrent::Promise.new { p "bitfinex" }
    
    proc = Proc.new do
      puts 10
    end
    
    e = Concurrent::Promise.all?(cbr_promise, bitfinex_promise).execute.then(&proc)
    
    sleep 1
    

    产量

    "cbr"
    "bitfinex"
    10
    

    注意这不会执行proc,因为其中一个Promise失败了:

    require 'concurrent'
    
    cbr_promise       = Concurrent::Promise.new { p "cbr" }
    bitfinex_promise  = Concurrent::Promise.new { p "bitfinex"; raise 'error' }
    
    proc = Proc.new do
      puts 10
    end
    
    e = Concurrent::Promise.all?(cbr_promise, bitfinex_promise).execute.then(&proc)
    
    sleep 1
    

    产量

    "cbr"
    "bitfinex"