Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Goroutine Berkelakuan Berbeza Antara Go Playground dan Mesin Tempatan?
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.
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.
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!