concurrent-rubyの使い方を調べていて、こちらのページを見つけたのですが、解説が正しくなかったので、正しい挙動をメモ。
このQiitaのページでは、以下のように記載があります。
zipとういうメソッドが用意されているのでそれを使用すると、同時にスレッドが実行され、それらの返り値が配列にまとめられます。
しかし、Concurrent::Promises.future
はfuture_on
のshortcutであり、future_on
はeval on immediately
であるので、futureを作った時点で実行が始まります。そのため、zipとは関係なく、threadの状態はfullfilled
になります。
Constructs new Future which will be resolved after block is evaluated on default executor. Evaluation begins immediately.
zipメソッドで処理を発火したい場合は、delay
を使います。
threads = (1..5).map do |i| |
実行結果(delay)
before zip: 2021-04-11 14:56:35 +0900 # zipで発火するまでスレッドは実行されていない |
実行結果(futureの場合)
ruby aaa.rb |