Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Pakej Konteks Go Memastikan Penamatan Berbilang Goroutine dengan Anggun?

Bagaimanakah Pakej Konteks Go Memastikan Penamatan Berbilang Goroutine dengan Anggun?

Barbara Streisand
Lepaskan: 2024-12-04 17:02:11
asal
165 orang telah melayarinya

How Can Go's Context Package Ensure Graceful Termination of Multiple Goroutines?

Menyegerakkan Goroutine dengan Konteks

Dalam Go, terdapat cabaran apabila bekerja dengan goroutine: memastikan penamatan yang teratur. Pertimbangkan senario dengan berbilang goroutine yang beroperasi secara berasingan, tetapi anda mahu ia disegerakkan supaya apabila satu goroutine selesai, yang lain juga harus keluar.

Coretan kod yang disediakan termasuk dua goroutine yang terus dijalankan. Jika ralat berlaku dalam satu goroutine, anda berhasrat untuk menamatkan kedua-duanya. Menggunakan saluran untuk isyarat siap boleh menyebabkan panik kerana menulis kepada saluran tertutup.

Pendekatan yang disyorkan untuk senario sedemikian ialah menggunakan pakej konteks Go, yang membolehkan komunikasi antara gorouti.

Dalam contoh kod di bawah, konteks latar belakang dicipta dengan fungsi cancel menggunakan context.WithCancel. Penyegerakan.WaitGroup dibuat untuk menjejak bilangan gorouti yang sedang berjalan.

package main

import (
    "context"
    "sync"
)

func main() {

    ctx, cancel := context.WithCancel(context.Background())
    wg := sync.WaitGroup{}
    wg.Add(3)
Salin selepas log masuk

Tiga goroutine dimulakan. Dua goroutine pertama terus berjalan, menunggu isyarat daripada konteks. Setelah menerima isyarat, mereka keluar dengan anggun.

    go func() {
        defer wg.Done()
        for {
            select {
            // msg from other goroutine finish
            case <-ctx.Done():
                // end
            }
        }
    }()

    go func() {
        defer wg.Done()
        for {
            select {
            // msg from other goroutine finish
            case <-ctx.Done():
                // end
            }
        }
    }()
Salin selepas log masuk

Groutine ketiga menjalankan operasi dan kemudian memanggil fungsi batal untuk menandakan selesainya tugasnya. Tindakan ini menggesa konteks ditutup, mencetuskan dua goroutine yang lain untuk keluar.

    go func() {
        defer wg.Done()
        // your operation
        // call cancel when this goroutine ends
        cancel()
    }()
Salin selepas log masuk

Akhir sekali, fungsi wg.Wait menunggu sehingga ketiga-tiga goroutine selesai sebelum rutin utama keluar.

    wg.Wait()
}
Salin selepas log masuk

Pendekatan berasaskan konteks ini memastikan bahawa apabila mana-mana goroutine selesai, yang lain dimaklumkan dan ditamatkan dengan baik, menyediakan cara yang bersih dan cekap untuk mengendalikan penyegerakan goroutine.

Atas ialah kandungan terperinci Bagaimanakah Pakej Konteks Go Memastikan Penamatan Berbilang Goroutine dengan Anggun?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan