ブロックチェーンアプリケーションを最初から開発する(10)-golangコルーチンの使用

1.並行性とは何ですか

1.1並行性の定義

この概念をもっと面白く説明するために、私は知乎についての答えを借りました:あなたは食事の途中で、電話が来て、食べ終わるまでそれを受け取らない、つまりあなたは並行性をサポートしていませんまたは並列処理。食事の途中で電話がかかってきたら、電話に出るのをやめてから食事を続けます。つまり、並行性をサポートします。食事の途中で電話が来て、電話中に食事をします。これは、並列処理をサポートしていることを示しています。並行性の鍵は、必ずしも同時にではなく、複数のタスクを処理する能力です。並列処理の鍵は、複数のタスクを同時に処理できることです。CPUに対応して、マルチコアの場合、同時に実行する機能、つまり並列化する機能があります。Go言語の場合、並行性と並列性のためにコードを単独で配置します。

1.2並行性の利点

2.コルーチンとは

2.1コルーチンの定義

コルーチンは、マイクロスレッドとも呼ばれるユーザーモードの軽量スレッドです。

goプログラムでは、go言語は、実行時にシステムレベルのスレッドを自動的に作成および破棄します。システムレベルのスレッドとは、オペレーティングシステムによって提供されるスレッドを指します。

次に、対応するユーザーレベルのスレッドは、システムレベルのスレッド上に構築されたスレッドを参照します。ユーザーレベルのスレッドの作成、破棄、スケジューリング、および状態変化はすべて、プログラムによって実装および処理される必要があります。

スレッドと比較して、gotoutineを作成するコストは非常に小さく、単なるコード、関数エントリです。

2.2コルーチンの利点

コルーチンの作成と破棄はオペレーティングシステムで行う必要がないため、スレッド切り替えのオーバーヘッドがないため、速度が非常に速くなり、タスクの同時実行性が向上します。

3、golangコルーチンの練習

コルーチンはスレッドに似ていますが、オペレーティングシステムではなくGoによってスケジュールされます。コルーチンで実行されているコードは、他のコードと同時に実行できます。1つ見てみましょう

package main

import (
  "fmt"
  "time"
)

func main() {
  fmt.Println("start")
  go process()
  time.Sleep(time.Millisecond * 10) // this is bad, don't do this!
  fmt.Println("done")
}

func process() {
  fmt.Println("processing")
}

ここには興味深いことがいくつかありますが、最も重要なのは、コルーチンを開始する方法です。goキーワードを使用してから、実行する関数を使用します。上記のように、コードの一部のみを実行する場合は、無名関数を使用できます。匿名関数はコルーチンだけでなく、他の場所でも使用できることに注意してください。

go func() {
  fmt.Println("processing")
}()

コルーチンは作成が簡単で、オーバーヘッドがほとんどありません。最終的に、複数のコルーチンが同じ基盤となるオペレーティングシステムスレッドで実行されます。これは、N個のオペレーティングシステムスレッドで実行されているM個のアプリケーションスレッド(コルーチン)があるため、一般にM:Nスレッドモデルとも呼ばれます。その結果、コルーチンのオーバーヘッドは、システムスレッドと比較して比較的低くなります(数キロバイト)。最新のハードウェアでは、何百万ものコルーチンを持つことが可能です。

また、マッピングとスケジューリングの複雑さはここに隠されています。このコードは同時に実行し、Goにそれ自体を実装させる必要があると言う必要があります。

例に戻ると、Sleepを使用してプログラムを数ミリ秒待機させていることがわかります。これは、コルーチンがメインプロセスが終了する前に実行される可能性があるためです(メインプロセスは、すべてのコルーチンが実行を完了するのを待ってから終了するわけではありません)。これを修正するには、コードを調整する必要があります。

おすすめ

転載: blog.csdn.net/cljdsc/article/details/122675314