ホームページ >バックエンド開発 >Golang >Go 言語の同時実行性の概要 (コード付き)

Go 言語の同時実行性の概要 (コード付き)

尚
転載
2019-11-25 14:49:342403ブラウズ

Go 言語の同時実行性の概要 (コード付き)

なぜ Go 言語 を使用するのかと問われたら、Go 言語の同時プログラミングについて言及する必要があります。 C 言語で非常に面倒で複雑な同時実行プログラムを作成する場合、Go 言語では非常に便利に思えます。

Go の同時実行プログラムは 2 つのものに依存します: goroutine とchannel

Goroutine とは何かを理解しますか?

初心者向け 学者向け, goroutine はスレッドとして直接理解できます。関数で go を呼び出して goroutine を開始することは、関数を実行するスレッドを開始することと同じです。

実際には、ゴルーチンはスレッドと同等ではなく、ゴルーチンの登場により、元のスレッドの概念が置き換えられ、最小のスケジューリング単位になります。

ゴルーチンが実行されると、まず先頭のスレッドを検索します。スレッドがブロックされている場合は、アイドル状態のスレッドに割り当てられます。アイドル状態のスレッドがない場合は、新しいスレッドが作成されます。 goroutine の実行が完了すると、スレッドはリサイクルされずにプッシュアウトされず、アイドル スレッドになることに注意してください。

ゴルーチンの使用法は非常に簡単です。 gof(11)

を追加します。関数の前

go f(11) //これは f() 関数を goroutine として実行させるためです

しかし go には欠点があります。メインスレッドが待機する必要がある場合はどうすればよいですか処理する前に終了するゴルーチン? 「Go 言語の学習」から例を見てみましょう。

なぜ 18 行目はスリープする必要があるのでしょうか?これは、上記の 2 つの準備完了プロセスが完了するまで待機するためです。

Go 言語の同時実行性の概要 (コード付き)さて、ここで要件が発生します。ゴルーチンが終了した後、データをメインスレッドに送信して、ゴルーチンが終了したことをメインスレッドに伝える必要があります。

チャネルの概念はここで紹介されます

チャネルの使用法

チャネルの意味は、次のような言語で理解できます。 this: Main スレッドでは goroutine を開くことができると皆に伝えていますが、私はメイン スレッドでパイプを開きました。やりたいことが終わったら、パイプに何かを詰め込んで完了したことを知らせます。 上記の例は次のように変更できます:

このプログラムから取得される一部の情報:

Go 言語の同時実行性の概要 (コード付き)

1 チャンネルのみmake を使用して作成します。

#基本的な形式は c := make(chan int)

int で、このパイプが送信できるデータの種類を示します

# 2 チャンネルにデータを挿入する操作

c

とても鮮やかですね?

3 チャンネルからのデータの出力

4 なぜ 2 回出力する必要があるのですか (4 行目と 5 行目?)

2 と 3 が始まるからです。各 goroutine はパイプに 1 を出力するため、メインスレッドは両方の goroutine が終了したことを示すためにそれを 2 回受け取る必要があります。

#チャネルのさらなる理解:

チャネルはバッファありとバッファなしの 2 種類に分かれており、デフォルトはバッファなしです ci := make(chan int) //バッファなし cj := make(chan int, 0) //バッファなし

cs := make(chan int, 100) //バッファあり

バッファ付きチャネルなので、次の点に注意する必要があります。 "get" の前に "put"

バッファリングされていないチャネルなので、"put" の前の "get" に注意してください

また、最初に hello world を出力します。バッファリングされたチャネルを使用します。 チャネルとバッファリングされていないチャネルは次のとおりです。 :

バッファリングされたチャネル:

var a string
var c = make(chan int, 10)
  
func f() {
    a = "hello, world"
    c <- 0
}
  
func main() {
    go f()
    <-c
    print(a)
 
}

ここにはバッファがあるため、データを配置する操作は c

バッファなしチャネル:

var a string
var c = make(chan int)
  
func f() {
    a = "hello, world"
    <-c
}
  
func main() {
    go f()
    c <- 0
    print(a)
 
}

c はバッファなしチャネルであるため、フェッチ操作は保証されている必要があります

を実行する前に、フェッチ操作を保証する必要があります推奨事項: golang チュートリアル コラム

以上がGo 言語の同時実行性の概要 (コード付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。