Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Goroutine Berkelakuan Berbeza Antara Go Playground dan Mesin Tempatan?

Bagaimanakah Goroutine Berkelakuan Berbeza Antara Go Playground dan Mesin Tempatan?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-23 17:42:24534semak imbas

How Do Goroutines Behave Differently Between Go Playground and Local Machine?

Percanggahan antara Go Playground dan Go on mesin tempatan saya

Isu: Goroutines in Go Playground vs. local machine

Untuk menjelaskan salah faham tentang gorouti, kod ini telah dijalankan di Go Playground:

<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.")
}</code>

Di Go Playground, ia telah menghasilkan ralat: "Proses mengambil masa terlalu lama." Ini menunjukkan bahawa goroutine yang dibuat dalam yang lain berjalan selama-lamanya.

Walau bagaimanapun, menjalankan kod yang sama secara setempat menghasilkan output serta-merta:

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

Ini membayangkan bahawa goroutine dalam yang lain keluar apabila goroutine utama selesai.

Penjelasan

Juza adalah disebabkan oleh nilai lalai GOMAXPROCS.

On the Go Playground, GOMAXPROCS ditetapkan kepada 1. Ini bermakna hanya satu goroutine boleh dijalankan pada satu masa. Apabila goroutine yang dicipta dalam yang lain tidak menyekat (cth., dengan menunggu di saluran), penjadual tidak akan bertukar kepada goroutine lain.

Memandangkan goroutine utama menyekat pada saluran yang telah selesai, penjadual beralih ke goroutine dalam yang lain. Kemudian, goroutine dalam yang lain melancarkan goroutine lain dengan gelung yang tidak berkesudahan. Memandangkan GOMAXPROCS ialah 1, goroutine utama tidak diteruskan dan gelung tanpa henti terus berjalan, membawa kepada tamat masa.

Pada mesin tempatan, GOMAXPROCS biasanya lalai kepada bilangan teras CPU (cth., 4 atau 8). Ini membolehkan berbilang goroutine berjalan serentak. Apabila goroutine utama menyekat pada saluran yang telah selesai, penjadual beralih ke goroutine lain. Ini boleh jadi goroutine dalam yang lain atau goroutine yang menjalankan gelung tidak berkesudahan.

Memandangkan goroutine utama akhirnya akan selesai, gelung tidak berkesudahan tidak akan berjalan lagi. Oleh itu, program ini akan ditamatkan seperti biasa, tanpa menunggu gelung tidak berkesudahan selesai.

Kesimpulan

Apabila menjalankan goroutine dalam Go Playground, adalah penting untuk mempertimbangkan nilai lalai GOMAXPROCS. Untuk mensimulasikan serentak berbilang goroutine, tetapkan GOMAXPROCS secara eksplisit kepada nilai yang lebih tinggi, seperti masa jalan.GOMAXPROCS(2). Dalam pelaksanaan tempatan, tetapan lalai GOMAXPROCS biasanya membenarkan gelagat serentak yang dijangkakan.

Atas ialah kandungan terperinci Bagaimanakah Goroutine Berkelakuan Berbeza Antara Go Playground dan Mesin Tempatan?. 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