Heim >Backend-Entwicklung >Golang >Erstellung und Verwaltung von Goroutinen in Golang-Funktionen

Erstellung und Verwaltung von Goroutinen in Golang-Funktionen

王林
王林Original
2024-06-05 19:06:011094Durchsuche

Erstellen Sie in der Go-Sprache eine Goroutine mit dem Schlüsselwort go und einem Funktionsaufruf. Verwenden Sie beim Verwalten von Goroutine sync.WaitGroup für die Synchronisierung. Verwenden Sie das Kontextpaket, um Goroutine abzubrechen. Im tatsächlichen Kampf können damit Netzwerkanfragen, Bildverarbeitung und andere Aufgaben parallel verarbeitet werden.

Golang 函数中 goroutine 的创建和管理

Erstellung und Verwaltung von Goroutinen in Golang-Funktionen

Goroutine (Coroutine) ist eine leichte parallele Ausführungseinheit in der Go-Sprache, die mehrere Aufgaben gleichzeitig in einem einzigen Thread ausführen kann.

Eine Goroutine erstellen

Eine Goroutine erstellen ist sehr einfach. Sie können das Schlüsselwort go verwenden, gefolgt von einem Funktionsaufruf: go 关键字后跟一个函数调用即可:

func hello() {
    fmt.Println("Hello from goroutine")
}

func main() {
    go hello() // 创建一个执行 hello() 函数的 goroutine
}

Goroutine 管理

同步

在处理共享资源时,需要对 goroutine 进行同步。使用 sync.WaitGroup 可以等待一组 goroutine 完成:

var wg sync.WaitGroup

func hello(name string) {
    wg.Add(1)
    defer wg.Done()

    fmt.Println("Hello", name)
}

func main() {
    wg.Add(3)
    go hello("John")
    go hello("Mary")
    go hello("Bob")
    wg.Wait() // 等待所有 goroutine 完成
}

取消

可以使用 context

import (
    "context"
    "fmt"
    "time"
)

func heavyComputation(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            fmt.Println("Computation cancelled")
            return
        default:
            // 执行计算
        }
    }
}

func main() {
    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
    defer cancel()

    go heavyComputation(ctx)
    time.Sleep(10 * time.Second) // 10 秒后取消计算
}

Goroutine-Verwaltung

Synchronisierung

Verarbeitung geteilt Ressourcen Wenn Goroutine synchronisiert werden muss. Verwenden Sie sync.WaitGroup, um auf den Abschluss einer Gruppe von Goroutinen zu warten:

func main() {
    urls := []string{"https://example.com", "https://example.net", "https://example.org"}

    var wg sync.WaitGroup

    for _, url := range urls {
        wg.Add(1)
        go func(url string) {
            resp, err := http.Get(url)
            if err != nil {
                log.Fatal(err)
            }

            resp.Body.Close()
            wg.Done()
        }(url)
    }

    wg.Wait()
}

Abbrechen

Sie können das Paket context verwenden, um Goroutinen abzubrechen:
func main() {
    images := []string{"image1.jpg", "image2.jpg", "image3.jpg"}

    var wg sync.WaitGroup

    for _, image := range images {
        wg.Add(1)
        go func(image string) {
            img, err := image.Decode(image)
            if err != nil {
                log.Fatal(err)
            }

            // 处理图像

            wg.Done()
        }(image)
    }

    wg.Wait()
}
Praxisfall

Parallele Verarbeitung von Netzwerkanfragen:

🎜rrreee🎜🎜Parallele Verarbeitung von Bildverarbeitung: 🎜🎜rrreee

Das obige ist der detaillierte Inhalt vonErstellung und Verwaltung von Goroutinen in Golang-Funktionen. 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