Go の同時プログラミングは、ゴルーチン (軽量スレッド) とチャネル (通信パイプ) を使用して実装されます。 goroutine は go キーワードを使用して作成されます。これは非常に軽量で、パフォーマンスに影響を与えることなく多数の goroutine を作成できます。チャネルはゴルーチン間の通信に使用され、型付きパイプです。この例は、効率を向上させるために goroutine を使用して URL を並行してクロールする同時クローラーのアプリケーションを示しています。
Go コア テクノロジー分析: 同時プログラミング
Go の同時実行モデルは、Goroutine (軽量スレッド) とチャネル (通信パイプライン)の概念。これらの機能を最大限に活用することで、開発者は同時実行性の高い高性能アプリケーションを構築できます。
Goroutine
Goroutine は Go の軽量スレッドで、キーワード go
によって作成されます。これらはコルーチン スケジューラ上で実行され、従来のスレッドとは異なり、ゴルーチンは非常に軽量であり、パフォーマンスに大きな影響を与えることなく数千個を作成できます。次のコードは、ゴルーチンを作成して使用する方法を示しています。
package main import ( "fmt" "runtime" ) func main() { fmt.Printf("Number of goroutines: %d\n", runtime.NumGoroutine()) // 当前正在运行的 goroutine 数量 // 创建一个 goroutine go func() { fmt.Println("Hello from a goroutine!") }() fmt.Printf("Number of goroutines: %d\n", runtime.NumGoroutine()) // 当前正在运行的 goroutine 数量 }
Channel
Channel は、ゴルーチン間の通信に使用されるパイプです。これらは型指定されており、特定の型の値のみを渡すことができることを意味します。次のコードは、チャネルを作成して使用する方法を示しています。
package main import ( "fmt" ) func main() { // 创建一个 int 类型的 channel c := make(chan int) // 向 channel 发送值 go func() { c <- 42 }() // 从 channel 接收值 v := <-c fmt.Println(v) // 输出:42 }
実用的なケース: 同時実行クローラー
以下は、ゴルーチンとチャネルを使用して同時実行クローラーを構築する単純化された例です。クローラ:
package main import ( "fmt" "net/http" "sync" ) var wg sync.WaitGroup func main() { // 要爬取的 URL 列表 urls := []string{ "https://example.com", "https://example2.com", "https://example3.com", } // 创建 channel 来接收每个 URL 的响应 results := make(chan string) // 为每个 URL 创建一个 goroutine for _, url := range urls { wg.Add(1) go func(url string) { resp, err := http.Get(url) if err != nil { fmt.Printf("Error fetching %s: %v\n", url, err) } else if resp.StatusCode == 200 { results <- url } wg.Done() }(url) } // 从 channel 中获取响应 go func() { for url := range results { fmt.Println(url) } }() // 等待所有 goroutine 完成 wg.Wait() }
ゴルーチンとチャネルを使用することで、このクローラは複数の URL を同時にクロールできるため、効率が向上します。
以上がGo言語のコア技術分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。