Rumah > pembangunan bahagian belakang > Golang > Bagaimanakah Saya Boleh Mengawal Perintah Pelaksanaan Goroutine dalam Go?

Bagaimanakah Saya Boleh Mengawal Perintah Pelaksanaan Goroutine dalam Go?

DDD
Lepaskan: 2024-12-29 18:55:10
asal
545 orang telah melayarinya

How Can I Control the Order of Execution of Goroutines in Go?

Ketidakpastian Perintah Pelaksanaan Goroutine

Dalam coretan kod yang disediakan, susunan pelaksanaan untuk kedua-dua goroutin adalah bukan deterministik. Output menunjukkan bahawa goroutine kedua dilaksanakan terlebih dahulu, walaupun ia dimulakan selepas yang pertama. Tingkah laku ini disebabkan oleh sifat serentak goroutine, yang bermaksud bahawa mereka melaksanakan secara bebas antara satu sama lain.

Mekanisme Penyegerakan dalam Goroutines

Untuk mengawal susunan pelaksanaan goroutine , anda boleh menggunakan mekanisme penyegerakan yang disediakan oleh Go, seperti sebagai:

Saluran: Anda boleh menggunakan saluran untuk menyegerakkan pelaksanaan goroutin. Saluran ialah saluran komunikasi yang membolehkan goroutine menghantar dan menerima data. Dalam contoh yang diubah suai di bawah, saluran digunakan untuk menyekat goroutine utama sehingga goroutine pertama menyelesaikan pelaksanaannya sebelum goroutine kedua dimulakan.

func main() {

    c := make(chan int)

    go sum([]int{1, 2, 3}, c)

    // Use the channel to block until it receives a send
    x := <-c
    fmt.Println(x)

    // Then execute the next routine
    go sum([]int{4, 5, 6}, c)

    x = <-c
    fmt.Println(x)
}
Salin selepas log masuk

Kumpulan Tunggu: Kumpulan tunggu ialah satu lagi mekanisme penyegerakan yang membolehkan anda menunggu beberapa goroutine untuk menyelesaikan pelaksanaan sebelum meneruskan. Dalam contoh berikut, kumpulan tunggu digunakan untuk memastikan semua goroutine selesai sebelum goroutine utama keluar.

func sum(a []int, c chan int, wg *sync.WaitGroup) {
    defer wg.Done()
    fmt.Println("summing: ", a)
    total := 0
    for _, v := range a {
        total += v
    }
    // Send total to c
    c <- total
}

func main() {

    c := make(chan int)
    wg := new(sync.WaitGroup)

    // Concurrently call the concurrent calls to sum, allowing execution to continue to the range of the channel
    go func() {
        // Increment the wait group, and pass it to the sum func to decrement it when it is complete
        wg.Add(1)
        go sum([]int{1, 2, 3}, c, wg)
        // Wait for the above call to sum to complete
        wg.Wait()
        // And repeat...
        wg.Add(1)
        go sum([]int{4, 5, 6}, c, wg)
        wg.Wait()
        // All calls are complete, close the channel to allow the program to exit cleanly
        close(c)
    }()

    // Range of the channel
    for theSum := range c {
        x := theSum
        fmt.Println(x)
    }

}
Salin selepas log masuk

Dengan menggunakan mekanisme penyegerakan ini, anda boleh mengawal susunan pelaksanaan goroutine dan memastikan bahawa urutan operasi yang diingini dikekalkan.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mengawal Perintah Pelaksanaan Goroutine dalam Go?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan