我在执行所有承诺后试图进行一些计算。但是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
从不打电话。
答案 0 :(得分:4)
Concurrent::Promise.all?
返回Promise
,你必须执行它proc
作为块参数&proc
这将有效:
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"