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从来没有打电话.
Concurrent::Promise.all?返回 aPromise并且你必须执行它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
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)
| 归档时间: |
|
| 查看次数: |
352 次 |
| 最近记录: |