Go言語のコア技術分析

WBOY
リリース: 2024-04-03 17:15:01
オリジナル
1058 人が閲覧しました

Go の同時プログラミングは、ゴルーチン (軽量スレッド) とチャネル (通信パイプ) を使用して実装されます。 goroutine は go キーワードを使用して作成されます。これは非常に軽量で、パフォーマンスに影響を与えることなく多数の goroutine を作成できます。チャネルはゴルーチン間の通信に使用され、型付きパイプです。この例は、効率を向上させるために goroutine を使用して URL を並行してクロールする同時クローラーのアプリケーションを示しています。

Go言語のコア技術分析

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!