Penciptaan dan pengurusan goroutine dalam fungsi Golang

王林
Lepaskan: 2024-06-05 19:06:01
asal
1018 orang telah melayarinya

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
}
Salin selepas log masuk

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 完成
}
Salin selepas log masuk

取消

可以使用 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 秒后取消计算
}
Salin selepas log masuk

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()
}
Salin selepas log masuk

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()
}
Salin selepas log masuk
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!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!