Rumah >pembangunan bahagian belakang >Golang >Penciptaan dan pengurusan goroutine dalam fungsi Golang

Penciptaan dan pengurusan goroutine dalam fungsi Golang

王林
王林asal
2024-06-05 19:06:011101semak imbas

Dalam bahasa Go, buat goroutine menggunakan kata kunci go ditambah panggilan fungsi. Apabila mengurus goroutine, gunakan sync.WaitGroup untuk penyegerakan; Dalam pertempuran sebenar, ia boleh digunakan untuk memproses permintaan rangkaian, pemprosesan imej dan tugas lain secara selari.

Golang 函数中 goroutine 的创建和管理

Penciptaan dan pengurusan goroutine dalam fungsi Golang

Goroutine (coroutine) ialah unit perlaksanaan selari yang ringan dalam bahasa Go yang boleh menjalankan berbilang tugas serentak dalam satu urutan.

Mencipta Goroutine

Mencipta goroutine adalah sangat mudah Anda boleh menggunakan kata kunci go diikuti dengan panggilan fungsi: 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 秒后取消计算
}

Pengurusan goroutine

Penyegerakan

Memproses dikongsi. sumber Apabila , goroutine perlu disegerakkan. Gunakan sync.WaitGroup untuk menunggu sekumpulan goroutin selesai:

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

Batal

Anda boleh menggunakan pakej konteks untuk membatalkan gorouti:
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()
}
Kes praktikal

Pemprosesan selari permintaan rangkaian:

🎜rrreee🎜🎜Pemprosesan selari pemprosesan imej: 🎜🎜rrreee

Atas ialah kandungan terperinci Penciptaan dan pengurusan goroutine dalam fungsi Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn