ホームページ  >  記事  >  バックエンド開発  >  Go言語で同時実行を行う方法

Go言語で同時実行を行う方法

青灯夜游
青灯夜游オリジナル
2023-01-18 14:19:011719ブラウズ

Go 言語は、コンパイラ ランタイム (ランタイム) を通じて同時実行機能をサポートしており、同時実行は goroutine を通じて完了します。 Goroutine は、単一プロセスで数千の同時タスクを実行できる非常に軽量な実装であり、Go 言語の同時実行設計の中核です。 go キーワードを使用して goroutine を作成し、呼び出す必要がある関数の前に go 宣言を配置し、同じアドレス空間で関数を呼び出して実行すると、関数が独立した同時スレッドとして実行されます。

Go言語で同時実行を行う方法

このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。

同時実行性とは、複数のタスクを同時に実行できることを意味します。並行プログラミングは、マルチスレッド プログラミング、マルチプロセス プログラミング、分散プログラムなどを含む広い意味を持ちます。

Go 言語は、コンパイラ ランタイムを通じて同時実行機能をサポートします。 Go 言語の同時実行性は、ゴルーチン機能によって実現されます。ゴルーチンはスレッドに似ていますが、必要に応じて複数のゴルーチンを作成して同時に動作させることができます。 Goroutine は Go 言語のランタイムによってスケジュールされますが、スレッドはオペレーティング システムによってスケジュールされます。

Go 言語は、複数のゴルーチン間の通信用のチャネルも提供します。 Goroutine とチャネルは、Go 言語が準拠する CSP (Communicating Sequential Process) 同時実行モデルの重要な実装基盤です。

Goroutine の概要

Goroutine は、単一プロセスで数千の同時タスクを実行できる非常に軽量な実装であり、Go の核心です。言語の同時実行設計。

結局のところ、ゴルーチンは実際にはスレッドですが、スレッドよりも小さいため、12 個のゴルーチンが最下層の 5 ~ 6 個のスレッドに反映される場合があり、Go 言語ではゴルーチン間のメモリ共有も実装されています。

go キーワードを使用して goroutine を作成し、呼び出す必要がある関数の前に go 宣言を配置し、この関数を同じアドレス空間で呼び出して実行します。これにより、関数が実行されるときに、独立した同時スレッドとして機能し、この種のスレッドを Go 言語ではゴルーチンと呼びます。

ゴルーチンの使用法は次のとおりです。

//go 关键字放在方法调用前新建一个 goroutine 并执行方法体
go GetThingDone(param1, param2);
//新建一个匿名方法并执行
go func(param1, param2) {
}(val1, val2)
//直接新建一个 goroutine 并在 goroutine 中执行代码块
go {
    //do someting...
}

ゴルーチンはマルチコア CPU 環境で並列であるため、コード ブロックが複数のゴルーチンで実行される場合、コードの並列性が達成されます。

プログラムの実行を知る必要がある場合、並列結果を取得するにはどうすればよいでしょうか?チャネルと組み合わせて使用​​する必要があります。

channel

channel は Go 言語が言語レベルで提供する goroutine 間の通信メソッドです。チャネルを使用して、2 つ以上のゴルーチン間でメッセージを渡すことができます。

チャネルはプロセス内通信メソッドであるため、チャネルを介してオブジェクトを渡すプロセスは、関数呼び出し時のパラメータ受け渡し動作と一致します。たとえば、ポインタも渡すことができます。クロスプロセス通信が必要な場合は、Socket や HTTP などの通信プロトコルを使用するなど、分散システムのアプローチを使用することをお勧めします。 Go 言語はインターネットを非常に完全にサポートしています。

チャネルは型に関連しています。つまり、チャネルは 1 つの型の値のみを渡すことができ、チャネルを宣言するときにこの型を指定する必要があります。 Unix パイプについてある程度の知識があれば、タイプセーフなパイプとみなされるチャネルを理解することは難しくありません。

チャネルを定義するときは、チャネルに送信される値のタイプも定義する必要があります。チャネルを作成するには make を使用する必要があることに注意してください。コードは次のとおりです:

ci := make(chan int)
cs := make(chan string)
cf := make(chan interface{})

戻るWindows や Linux が登場する前は、命令型プログラミング言語はシリアル化に基づいているため、古代にはプログラム開発時に同時実行性の概念はありませんでした。プログラムは各命令を順番に実行します。プログラム全体には 1 つの実行コンテキストしかありません。つまり、呼び出しスタックとヒープです。

同時実行性とは、プログラムが実行時に複数の呼び出しスタックに対応する複数の実行コンテキストを持っていることを意味します。各プロセスが実行されているとき、プロセスには独自のコール スタックとヒープ、および完全なコンテキストがあることがわかっています。オペレーティング システムがプロセスをスケジュールすると、スケジュールされたプロセスのコンテキストが保存されます。プロセスがタイム スライスを取得した後、プロセスのコンテキストをシステムに復元します。

オペレーティング システム全体の観点から見ると、複数のプロセスを並行して行うことができます。では、並行性の価値は何でしょうか?まず次のシナリオを見てみましょう。

1) 一方で、応答性の高いグラフィカル ユーザー インターフェイスが必要ですが、他方では、プログラムは大量の操作や IO 集中型の操作を実行する必要もあり、そのインターフェイスを作成する必要があります。応答と操作は同時に実行されます。

2) Web サーバーが大量のユーザー要求に直面すると、それぞれのユーザーに応答するためにより多くの「Web サーバー ワーク ユニット」が必要になります。

3) 私たちのトランザクションは分散環境にあります。同じワークユニットが異なるコンピューター上でシャードされたデータを処理します。コンピューターの CPU はシングルコアからマルチコアに発展し、プログラムはすべてシリアルであり、その機能はコンピュータのハードウェアが十分に活用されていません。

4) IO 操作によりプログラムがブロックされ、プログラム全体が停滞状態になり、他の IO 関連タスクを実行できなくなります。

上記の例からわかるように、シリアル プログラムは多くのシナリオで要件を満たすことができません。以下に、同時実行が不可欠であることを誰もが理解できるように、同時実行プログラムのいくつかの利点をまとめました:

  • 同時実行は問題モデルをより客観的に表現できます;

  • 同時実行性は、CPU コアの利点を最大限に活用し、プログラムの実行効率を向上させることができます。

  • 同時実行性は、CPU と他のハードウェア デバイス間の固有の非同期性を最大限に活用できます。 。

[関連する推奨事項: Go ビデオ チュートリアル プログラミング教育 ]

以上がGo言語で同時実行を行う方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。