質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

Q&A

解決済

1回答

5797閲覧

Coroutineで大量の処理を並列実行したい

CAIOS

総合スコア24

Kotlin

Kotlinは、ジェットブレインズ社のアンドリー・ブレスラフ、ドミトリー・ジェメロフが開発した、 静的型付けのオブジェクト指向プログラミング言語です。

0グッド

1クリップ

投稿2020/06/18 16:25

KotlinのCoroutineで大量の処理を複数実行したいです。処理を並列実行するには以下のように、asyncで動かして、awaitで待ち合せればいいとのことですが、この処理が大量にある場合はどうしたらいいのでしょうか?

例えば以下のprocess関数に1~1000を代入して関数を走らせるとします。それぞれの処理に1秒かかるとしたら、普通にやれば1000秒、並列処理で行えば1秒で処理が終わることになります。しかし、以下のように1000個すべてにawait()と書くわけにもいきませんし、そもそも1000という数が動的に変わる値であったら対応できません。

このような場合はどのように並列処理を実現するのでしょうか?

Kotlin

1fun runMain(): Job = scope.launch { 2 val price1 = async { process(1) } 3 val price2 = async { process(2) } 4 println("Result: ${price1.await()}, ${price2.await()}) 5}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

任意の数のcoroutineを並列で起動させたいということであれば、単純にforEach等のループでcoroutineを生成し、その後にawaitで待ち合わせをするように書けばOKです。

kotlin

1// count個のasyncを起動して待ち合わせ 2val prices = (1..count) 3 .map { async { process(it) } } 4 .map { it.await() } 5println("Results: ${prices})

ただし、asyncの中の処理が実際に並列に実行されるかどうかはDispatcherで指定したスレッドプールの最大値に依存します。例えばDispatchers.Defaultであれば、CPUコアの数がスレッドプールの最大値として設定されています。

It is backed by a shared pool of threads on JVM. By default, the maximum number of threads used by this dispatcher is equal to the number of CPU cores, but is at least two.

投稿2020/06/20 03:51

kakajika

総合スコア3131

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

CAIOS

2020/06/20 15:15

うまく動作させることができました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問