[解決済み] Kotlinにおけるスレッドとコルーチンの違い
質問
Kotlinの言語実装で、他の言語のコルーチンの実装と異なる点はありますか?
- コルーチンは軽量スレッドのようなものというのはどういうことですか?
- 何が違うのでしょうか?
- kotlinのコルーチンは、実際に並列/並行で動作しているのでしょうか?
- マルチコアシステムでも、コルーチンは常に1つしか実行されません(正しいですか)?
ここで、100000個のコルーチンを起動していますが、このコードの背後では何が起こっているのでしょうか?
for(i in 0..100000){
async(CommonPool){
//run long running operations
}
}
どのように解決するのですか?
コルーチンを使うのはJVMだけなので、JVMのバックエンドの話をします。Kotlin NativeやKotlin JavaScriptもありますが、これらのKotlinのバックエンドは私の範囲外です。
では、Kotlinのコルーチンと他の言語のコルーチンを比較するところから始めましょう。基本的にコルーチンにはスタックレス型とスタックフル型の2種類があることを知っておくとよいでしょう。Kotlinはスタックレスコルーチンを実装しています。つまり、コルーチンはそれ自身のスタックを持たず、コルーチンができることを少し制限しています。詳しい説明は はこちら .
例です。
- スタックレス。C#、Scala、Kotlin
- スタックフル Quasar、Javaflow
コルーチンは軽量スレッドのようなものだというのはどういうことですか?
Kotlinのコルーチンは独自のスタックを持たず、ネイティブスレッドにマッピングせず、プロセッサのコンテキストスイッチを必要としない、ということです。
何が違うのでしょうか?
スレッド - プリエンプティブにマルチタスクを行う。( 通常 ). コルーチン - 協力してマルチタスクを行う。
スレッド - OSによって管理される(通常)。 コルーチン - ユーザが管理する。
kotlinのコルーチンは実際に並列/同時進行しているのでしょうか?
各コルーチンを独立したスレッドで実行するか、すべてのコルーチンを1つのスレッドまたは固定スレッドプールで実行するかは、その方法次第です。
コルーチンの実行方法についてもっと詳しく はこちら .
<ブロッククオートマルチコアシステムでも、常に1つのコルーチンしか動作していない(ということでいいのかな?)
いいえ、前の回答を参照してください。
<ブロッククオートここで100000コルーチンを開始していますが、このコードの背後では何が起こっているのでしょうか?
実は、それは場合によります。しかし、次のようなコードを書いたとします。
fun main(args: Array<String>) {
for (i in 0..100000) {
async(CommonPool) {
delay(1000)
}
}
}
このコードは即座に実行されます。
からの結果を待つ必要があるため
async
の呼び出しの結果を待つ必要があるからです。
では、これを修正しましょう。
fun main(args: Array<String>) = runBlocking {
for (i in 0..100000) {
val job = async(CommonPool) {
delay(1)
println(i)
}
job.join()
}
}
このプログラムを実行すると、kotlinは2 * 100000のインスタンスを作成して
Continuation
のインスタンスが生成され、数十MBのRAMを消費し、コンソールには1から100000までの数字が表示されます。
では、このコードをこのように書き換えてみましょう。
fun main(args: Array<String>) = runBlocking {
val job = async(CommonPool) {
for (i in 0..100000) {
delay(1)
println(i)
}
}
job.join()
}
これでどうでしょう?ここで、100001個のインスタンスを作成し
Continuation
のインスタンスしか作成されないので、より良い結果が得られます。
作成された各ContinuationはCommonPool(ForkJoinPoolの静的インスタンスである)上でディスパッチされ、実行される。
関連
-
[解決済み] Kotlin 三項条件演算子
-
[解決済み] Kotlinのvarとvalの違いは何ですか?
-
[解決済み】KotlinでJavaの静的メソッドに相当するものは何ですか?
-
[解決済み] Kotlinにコンストラクタ参照はありますか?
-
[解決済み] Safeargsライブラリがディレクションクラスを生成しない
-
[解決済み] Kotlin データクラスのオーバーライドゲッター
-
[解決済み] Kotlinのゲッターとセッター
-
[解決済み] Kotlin: withContext() vs Async-await
-
[解決済み] Kotlinで抽象クラスのインスタンスを生成する
-
[解決済み] KotlinのコルーチンはRxKotlinよりどう優れているか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Kotlinにコンストラクタ参照はありますか?
-
[解決済み] Kotlinで多くの例外を同時にキャッチするには?
-
[解決済み] KotlinでNullチェックを行う最良の方法とは?
-
[解決済み] Safeargsライブラリがディレクションクラスを生成しない
-
[解決済み] Kotlin データクラスのオーバーライドゲッター
-
[解決済み] Kotlinのゲッターとセッター
-
[解決済み] Kotlin: withContext() vs Async-await
-
[解決済み] Kotlinで抽象クラスのインスタンスを生成する
-
[解決済み] KotlinのIntArrayとArray<Int>の比較
-
[解決済み] KotlinのIterableとSequenceは全く同じに見える。なぜ2つの型が必要なのでしょうか?