私。ゴルーチン: Go の同時実行モデルの詳細
ゴルーチンは Go 設計の基礎であり、同時プログラミングのための強力なメカニズムを提供します。 軽量のコルーチンとして、タスクの並列実行が簡素化されます。 goroutine の起動は簡単です。関数呼び出しの前に go
キーワードを付けて、非同期実行を開始するだけです。メインプログラムはゴルーチンの完了を待たずに続行されます。
go func() { // Launch a goroutine using the 'go' keyword // ... code to be executed concurrently ... }()
II. Goroutine の内部メカニズムを理解する
概念的な基礎
同時実行性と並列性
-
同時実行性: 単一の CPU 上で複数のタスクを一見同時に管理する機能。 CPU はタスク間を急速に切り替え、並列実行のような錯覚を生み出します。 微視的には連続的ですが、巨視的には同時的に見えます。
-
並列処理: 複数の CPU にわたる複数のタスクの真の同時実行により、CPU リソースの競合が排除されます。
プロセスとスレッド
-
プロセス: 独自のリソース (メモリ、ファイルなど) を備えた自己完結型の実行環境。 プロセス間の切り替えはリソースを大量に消費するため、カーネルレベルの介入が必要です。
-
スレッド: プロセス内の軽量の実行単位であり、プロセスのリソースを共有します。 スレッド切り替えは、プロセス切り替えよりもオーバーヘッドが少なくなります。
コルーチン
コルーチンは独自のレジスタ コンテキストとスタックを維持します。 コルーチン間の切り替えには、この状態の保存と復元が含まれ、中断したところから実行を再開できるようになります。 プロセスやスレッドとは異なり、コルーチン管理はオペレーティング システムではなくユーザー プログラム内で処理されます。ゴルーチンは、特定の種類のコルーチンです。
GPM スケジューリング モデル
Go の効率的な同時実行性は、GPM スケジューリング モデルに依存しています。 M、P、G、および Sched の 4 つの主要なコンポーネントが関係します (Sched は図には示されていません)。
-
M (マシン): カーネルレベルのスレッド。ゴルーチンは
さんで実行されます -
G (ゴルーチン): 単一のゴルーチン。 各 G には、独自のスタック、命令ポインター、およびその他のスケジューリング関連情報 (待機しているチャネルなど) があります。
-
P (プロセッサ): ゴルーチンを管理および実行する論理プロセッサ。準備完了の goroutine の実行キューを維持します。
-
Sched (スケジューラ): M キューと G キューを管理し、効率的なリソース割り当てを保証する中央スケジューラ。
実際のスケジュール設定
この図は、ゴルーチンを実行するプロセッサ (P) を備えた 2 つの OS スレッド (M) を示しています。
-
GOMAXPROCS()
は P の数 (つまり、実際の同時実行レベル) を制御します。 -
灰色の G は準備ができていますが、まだ実行されていません。 P はこの実行キューを管理します。
-
ゴルーチンを起動すると、P の実行キューに追加されます。
M0 がブロックされている場合、P は M1 (スレッド キャッシュから取得される可能性があります) に切り替わります。
P がタスクを迅速に完了すると、効率を維持するために他の P から仕事を盗む可能性があります。
III.ゴルーチンの操作
基本的な使い方
ゴルーチン実行用の CPU の数を設定します (通常、最近の Go バージョンのデフォルト設定で十分です):
go func() { // Launch a goroutine using the 'go' keyword // ... code to be executed concurrently ... }()
実践的な例
例 1: 単純なゴルーチンの計算
num := runtime.NumCPU() // Get the number of logical CPUs runtime.GOMAXPROCS(num) // Set the maximum number of concurrently running goroutines
ゴルーチンのエラー処理
ゴルーチン内の未処理の例外により、プログラム全体が終了する可能性があります。パニックを処理するには、recover()
ステートメント内で defer
を使用します。
package main import ( "fmt" "runtime" ) func cal(a, b int) { c := a + b fmt.Printf("%d + %d = %d\n", a, b, c) } func main() { runtime.GOMAXPROCS(runtime.NumCPU()) for i := 0; i < 10; i++ { go cal(i, i+1) } //Note: The main function exits before goroutines complete in this example. See later sections for synchronization. }
ゴルーチンの同期
ゴルーチンは非同期で実行されるため、メインプログラムは完了する前に終了する可能性があります。 同期には sync.WaitGroup
またはチャネルを使用します:
例 1: sync.WaitGroup
の使用
package main import ( "fmt" ) func addele(a []int, i int) { defer func() { if r := recover(); r != nil { fmt.Println("Error in addele:", r) } }() a[i] = i // Potential out-of-bounds error if i is too large fmt.Println(a) } func main() { a := make([]int, 4) for i := 0; i < 5; i++ { go addele(a, i) } // ... (add synchronization to wait for goroutines to finish) ... }
例 2: 同期にチャネルを使用する
package main import ( "fmt" "sync" ) func cal(a, b int, wg *sync.WaitGroup) { defer wg.Done() c := a + b fmt.Printf("%d + %d = %d\n", a, b, c) } func main() { var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.Add(1) go cal(i, i+1, &wg) } wg.Wait() }
Goroutine 間通信
チャネルは、ゴルーチン間の通信とデータ共有を容易にします。 グローバル変数も使用できますが、同時実行性の制御を向上させるには、一般にチャネルの使用が推奨されます。
例: 生産者と消費者のパターン
package main import ( "fmt" ) func cal(a, b int, ch chan bool) { c := a + b fmt.Printf("%d + %d = %d\n", a, b, c) ch <- true // Signal completion } func main() { ch := make(chan bool, 10) // Buffered channel to avoid blocking for i := 0; i < 10; i++ { go cal(i, i+1, ch) } for i := 0; i < 10; i++ { <-ch // Wait for each goroutine to finish } }
Leapcell: Go 用のサーバーレス プラットフォーム
Leapcell は、Go サービスを展開するための推奨プラットフォームです。
主な機能:
- 多言語サポート: JavaScript、Python、Go、Rust。
- 無料無制限プロジェクト: 従量課金制の価格設定。
- 費用対効果の高い: アイドル料金はかかりません。
- 開発者向け: 直感的な UI、自動化された CI/CD、リアルタイム メトリクス。
- スケーラブルで高性能: 自動スケーリング、運用オーバーヘッドなし。
ドキュメントで詳細を確認してください!
リープセル Twitter: https://www.php.cn/link/7884effb9452a6d7a7a79499ef854afd
以上がデコードされた Go の同時実行性: Goroutine のスケジューリングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

OpenSSLは、安全な通信で広く使用されているオープンソースライブラリとして、暗号化アルゴリズム、キー、証明書管理機能を提供します。ただし、その歴史的バージョンにはいくつかの既知のセキュリティの脆弱性があり、その一部は非常に有害です。この記事では、Debian SystemsのOpenSSLの共通の脆弱性と対応測定に焦点を当てます。 Debianopensslの既知の脆弱性:OpenSSLは、次のようないくつかの深刻な脆弱性を経験しています。攻撃者は、この脆弱性を、暗号化キーなどを含む、サーバー上の不正な読み取りの敏感な情報に使用できます。

この記事では、プロファイリングの有効化、データの収集、CPUやメモリの問題などの一般的なボトルネックの識別など、GOパフォーマンスを分析するためにPPROFツールを使用する方法について説明します。

この記事では、GOでユニットテストを書くことで、ベストプラクティス、モッキングテクニック、効率的なテスト管理のためのツールについて説明します。

この記事では、ユニットテストのためにGOのモックとスタブを作成することを示しています。 インターフェイスの使用を強調し、模擬実装の例を提供し、模擬フォーカスを維持し、アサーションライブラリを使用するなどのベストプラクティスについて説明します。 articl

この記事では、GENICSのGOのカスタムタイプの制約について説明します。 インターフェイスがジェネリック関数の最小タイプ要件をどのように定義するかを詳しく説明し、タイプの安全性とコードの再利用性を改善します。 この記事では、制限とベストプラクティスについても説明しています

この記事では、コードのランタイム操作に使用されるGoの反射パッケージについて説明します。シリアル化、一般的なプログラミングなどに有益です。実行やメモリの使用量の増加、賢明な使用と最高のアドバイスなどのパフォーマンスコストについて警告します

この記事では、トレースツールを使用してGOアプリケーションの実行フローを分析します。 手動および自動計装技術について説明し、Jaeger、Zipkin、Opentelemetryなどのツールを比較し、効果的なデータの視覚化を強調しています

この記事では、GOでテーブル駆動型のテストを使用して説明します。これは、テストのテーブルを使用して複数の入力と結果を持つ関数をテストする方法です。読みやすさの向上、重複の減少、スケーラビリティ、一貫性、および


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

ZendStudio 13.5.1 Mac
強力な PHP 統合開発環境

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

ホットトピック



