Rumah >pembangunan bahagian belakang >Golang >Mengapa Goroutines on Go Playground dan Mesin Tempatan Mempamerkan Perbezaan Tingkah Laku?

Mengapa Goroutines on Go Playground dan Mesin Tempatan Mempamerkan Perbezaan Tingkah Laku?

Barbara Streisand
Barbara Streisandasal
2024-10-23 17:05:01262semak imbas

Why Do Goroutines on Go Playground and Local Machines Exhibit Behavioral Differences?

Percanggahan antara Go Playground dan Mesin Tempatan

Apabila menjalankan kod di taman permainan Go, pembangun mungkin menghadapi percanggahan berbanding menjalankan kod yang sama pada mesin tempatan mereka. Artikel ini meneroka perbezaan tingkah laku, terutamanya apabila berurusan dengan goroutin dan mekanisme penyegerakan.

Kajian Kes: Kod Gelagat di Taman Permainan Pergi vs. Mesin Tempatan

Pertimbangkan kod Go berikut:

<code class="go">package main

import (
    "fmt"
)

func other(done chan bool) {
    done <- true
    go func() {
        for {
            fmt.Println("Here")
        }
    }()
}

func main() {
    fmt.Println("Hello, playground")
    done := make(chan bool)
    go other(done)
    <-done
    fmt.Println("Finished.")
}

Taman permainan On the Go, kod ini menghasilkan ralat: "Proses mengambil masa terlalu lama." Ini menunjukkan bahawa goroutine yang dibuat dalam fungsi lain berjalan selama-lamanya.

Walau bagaimanapun, menjalankan kod yang sama pada mesin tempatan dengan berbilang teras CPU (GOMAXPROCS > 1) menghasilkan output berikut:

<code class="text">Hello, playground
Finished.</code>

Ini menunjukkan bahawa goroutine yang dicipta dalam yang lain ditamatkan apabila goroutine utama selesai.

Menjelaskan Jurang Tingkah Laku

Gelagat yang berbeza antara taman permainan Go dan mesin tempatan boleh dikaitkan dengan bilangan pemproses yang tersedia. Di taman permainan Go, GOMAXPROCS lalai kepada 1, bermakna hanya satu goroutine boleh dijalankan pada satu masa. Oleh itu, dalam contoh di atas, goroutine tidak berkesudahan yang dicipta dalam yang lain menghalang goroutine utama daripada diteruskan.

Sebaliknya, apabila berjalan secara setempat dengan berbilang teras CPU, GOMAXPROCS lalai kepada bilangan teras yang tersedia, membenarkan berbilang goroutin untuk berjalan serentak. Oleh itu, goroutine tidak berkesudahan yang dicipta dalam yang lain tidak menghalang goroutine utama daripada keluar.

Kesimpulan

Gelagat goroutine dalam Go bergantung pada bilangan pemproses yang tersedia (GOMAXPROCS). Walaupun taman permainan Go menggunakan nilai lalai 1 yang boleh membawa kepada persepsi goroutine berjalan selama-lamanya, menjalankan kod yang sama pada mesin tempatan dengan berbilang teras memberikan gelagat berbeza di mana goroutine mungkin ditamatkan apabila goroutine utama selesai. Pemahaman ini membantu pembangun mengelakkan salah faham dan memastikan kod mereka berkelakuan seperti yang diharapkan dalam persekitaran yang berbeza.

Atas ialah kandungan terperinci Mengapa Goroutines on Go Playground dan Mesin Tempatan Mempamerkan Perbezaan Tingkah Laku?. 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