Heim  >  Artikel  >  Backend-Entwicklung  >  Gehen Sie zur Analyse der Kerntechnologie der Sprache

Gehen Sie zur Analyse der Kerntechnologie der Sprache

WBOY
WBOYOriginal
2024-04-03 17:15:011047Durchsuche

Die gleichzeitige Programmierung in Go wird mithilfe von Goroutine (Lightweight Thread) und Channel (Kommunikationspipe) implementiert. Goroutine wird über das Schlüsselwort go erstellt, das sehr leichtgewichtig ist und eine große Anzahl von Goroutinen erstellen kann, ohne die Leistung zu beeinträchtigen. Der Kanal wird für die Kommunikation zwischen Goroutinen verwendet und ist eine typisierte Pipe. Dieses Beispiel zeigt die Anwendung gleichzeitiger Crawler, bei denen Goroutine zum parallelen Crawlen von URLs verwendet wird, um die Effizienz zu verbessern.

Gehen Sie zur Analyse der Kerntechnologie der Sprache

Go-Kerntechnologieanalyse: Gleichzeitige Programmierung

Das Parallelitätsmodell in Go basiert auf den Konzepten von Goroutine (leichter Thread) und Kanal (Kommunikationspipe). Durch die vollständige Nutzung dieser Funktionen können Entwickler hochgradig gleichzeitige Hochleistungsanwendungen erstellen.

Goroutine

Goroutine ist ein leichter Thread in Go, der mit dem Schlüsselwort go erstellt wurde. Sie laufen auf einem Coroutine-Scheduler, und im Gegensatz zu herkömmlichen Threads sind Goroutinen sehr leichtgewichtig und können ohne nennenswerte Leistungseinbußen zu Tausenden erstellt werden. Der folgende Code zeigt, wie man Goroutinen erstellt und verwendet:

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 ist eine Pipe, die für die Kommunikation zwischen Goroutinen verwendet wird. Sie sind typisiert, was bedeutet, dass sie nur Werte bestimmter Typen übergeben können. Der folgende Code zeigt, wie ein Kanal erstellt und verwendet wird:

package main

import (
    "fmt"
)

func main() {
    // 创建一个 int 类型的 channel
    c := make(chan int)

    // 向 channel 发送值
    go func() {
        c <- 42
    }()

    // 从 channel 接收值
    v := <-c
    fmt.Println(v) // 输出:42
}

Praktischer Fall: Gleichzeitiger Crawler

Das Folgende ist ein vereinfachtes Beispiel für den Aufbau eines gleichzeitigen Crawlers mithilfe von Goroutine und Channel:

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()
}

Durch die Verwendung von Goroutine und Channel wird dies erreicht Der Crawler kann mehrere URLs gleichzeitig crawlen und so die Effizienz verbessern.

Das obige ist der detaillierte Inhalt vonGehen Sie zur Analyse der Kerntechnologie der Sprache. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn