Crystalは実行速度が非常に強力です。そのため、マルチスレッドで実行して、CPUのコアを効率的に使いたいなと感じることがあります。公式リファレンスを見ると、並列処理の項目があり、Crystal言語は並行処理をサポートしていないと明記してありますが、実際には、試験的な機能として提供しています。
クラッシュしたりオーバーハングしたりする可能性があり、オーバーヘッドも非常に大きいということです。
なので、現時点では正式に提供されている機能ではないそうです。
Crystal公式ブログの説明
dev.to の解説記事
要点
スクリプトのコンパイル: -D preview_mt
をつける。
crystal build -D preview_mt hoge.cr
スクリプトの内容: channel, spawn
を利用する。
channel = Channel(MyValue).new(array.size)
array.each do |value|
spawn do
# 処理
channel.send process(value)
end
end
results = Array.new(array.size) { channel.receive }
並列で実行した結果をファイルに保存して、親プロセスに結果を返却しないようなケースでも、channelは必ず利用する必要があります。そうしないと、単にspawnを実行せずに終了します。spawnの実行順序は不定で順番通りにはならないことにご注意ください。
channel = Channel(nil).new(array.size)
array.each do |value|
spawn do
# ファイルに結果を保存し、親プロセスに結果を戻さない処理
channel.send(nil)
end
end
array.size.times do
channel.receive
end
使ってみた印象だと、オーバーヘッドは大きいらしく、メモリも結構使用します。
今後Crystalの並列処理が便利になって、誰でも便利に使いこなせるようになることを願います。