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

zis*_*she 7 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 }
Run Code Online (Sandbox Code Playgroud)

concurrent-ruby宝石制成.

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

更新

我试图添加一个循环和byebug代码(在sidekiqworker中):

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

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

Ale*_*ber 5

  1. Concurrent::Promise.all?返回 aPromise并且你必须执行它
  2. 你必须proc作为块参数传递&proc
  3. 你必须等待承诺完成(例如睡眠)

这将起作用:

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
Run Code Online (Sandbox Code Playgroud)

产量

"cbr"
"bitfinex"
10
Run Code Online (Sandbox Code Playgroud)

请注意这将不会执行,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
Run Code Online (Sandbox Code Playgroud)

产量

"cbr"
"bitfinex"
Run Code Online (Sandbox Code Playgroud)