Go 言語では、関数とゴルーチンが同時プログラミングを実装します。 Go 関数は go キーワードを使用して同時に実行できます。Goroutine は、新しいスタックを割り当てて指定された関数を実行することで同時実行性を実現する軽量のスレッドです。実際のケースでは、ミューテックス ロック (同期パッケージ) はデータの競合を防ぐために使用され、コンテキスト (コンテキスト パッケージ) は同時実行機能のキャンセルと期限切れを制御するために使用されます。
さまざまな同時実行ライブラリでの Go 関数と Goroutine の実装
Go は、開発者が同時実行プログラムを実行できるようにするさまざまな同時実行プリミティブを提供します。簡単に書くことができます。この記事では、最も一般的に使用される 2 つの同時実行ライブラリについて説明します。
Function
Go 関数は並列実行できるため、同時実行性が実現します。同時関数は、次の構文を使用して作成できます。
go func() { // 并发执行的代码 }
Goroutine
Goroutine は、同時に実行できる Go の軽量スレッドです。 Goroutine が作成されると、新しいスタックが割り当てられ、指定された関数の実行が開始されます。 Goroutine は、次の構文を使用して作成できます。
go func() { // 并发执行的代码 }()
実際のケース: ミューテックス ロック
ミューテックス ロックは、共有リソースへのアクセスを調整し、データの競合を防ぐために使用されます。 sync パッケージは、共有変数を保護するために使用できる Mutex
タイプを提供します。
import ( "sync" "fmt" ) var ( count int mu sync.Mutex ) func increment() { mu.Lock() count++ mu.Unlock() } func main() { for i := 0; i < 1000; i++ { go increment() } fmt.Println(count) // 输出: 1000 }
実用的なケース: コンテキスト
コンテキストは、リクエストまたは操作のキャンセル ステータスを渡すために使用されます。 context パッケージには、同時関数の制御に使用できる Context
および CancelFunc
タイプが用意されています。
import ( "context" "fmt" "time" ) func main() { // 创建一个 Context,并在 1 秒后取消 ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() go func() { // 在 Context 被取消之前,不断打印 for { select { case <-ctx.Done(): fmt.Println("Context cancelled") break default: fmt.Println("Still running...") time.Sleep(100 * time.Millisecond) } } }() // 等待 Goroutine 完成或 Context 被取消 <-ctx.Done() }
異なる同時実行ライブラリでは、関数とゴルーチンの実装が若干異なる場合がありますが、それらの中心となる概念は同じです。同期タイプは共有リソースへのアクセスを調整するために使用され、コンテキストは同時実行機能のキャンセルと期限切れを管理するために使用されます。
以上がさまざまな同時実行ライブラリでの golang 関数と goroutine の実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。