LoginSignup
2
1

More than 1 year has passed since last update.

Crystalをマルチスレッドで実行してCPUのコアを効率的に使う

Last updated at Posted at 2021-06-30

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の並列処理が便利になって、誰でも便利に使いこなせるようになることを願います。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1