Golang は同時実行性に優れたプログラミング言語で、Goroutine は開発者が同時タスクをより適切に処理できる軽量のスレッド実装です。 Golang では、コルーチンはブロッキングとノンブロッキングの 2 つのモードに分類できます。この記事では、ブロッキング モードと非ブロッキング モードの Golang コルーチンの違いを詳しく説明し、読者がこの概念をよりよく理解できるように具体的なコード例を提供します。
ブロッキング モードでは、コルーチンがブロッキング操作を実行すると、操作が完了するまでコルーチン全体が一時停止されます。これは、プログラムの実行は操作が完了するまで待機し、他のタスクの実行を続行できないことを意味します。 Golang では、一般的なブロック操作には IO 操作、ネットワーク リクエストなどが含まれます。
以下はブロッキング モードを使用したサンプル コードです:
package main 輸入 ( 「fmt」 "時間" ) 関数 main() { 長く走ってくださいRunningTask() time.Sleep(5 * time.Second) } func longRunningTask() { fmt.Println("長いタスクの実行を開始します...") time.Sleep(10 * time.Second) fmt.Println("長いタスクの実行が完了しました!") }
上記の例では、longRunningTask
関数は、10 秒間スリープするシミュレートされた長いタスクです。 main
関数では、longRunningTask
関数を実行するために go
キーワードを使用してコルーチンを開始しましたが、メイン コルーチンが time.Sleep# を呼び出したためです。 ## は 5 秒間待機するため、プログラム全体が 5 秒間ブロックされてから終了します。
select ステートメントと
chan チャネルを使用して、ノンブロッキング タスク スケジューリングを実装します。
chan チャネルを使用して、長期タスクが完了したことをメイン コルーチンに通知しました。
main 関数では、
longRunningTask 関数を実行するコルーチンを開始し、
select ステートメントを使用してタスクが完了したかどうかを判断します。長いタスクが完了するのを待っている間でも、メイン コルーチンはブロックされることなく他のタスクを実行し続けることができます。
以上がGolang コルーチンのブロッキングとノンブロッキングの違いについての詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。