Percanggahan antara Go Playground dan Go on Your Machine
Apabila membandingkan gelagat gorouti dalam Go on the Go Playground dan pada mesin tempatan anda , anda mungkin menghadapi percanggahan. Untuk menjelaskan sebab asas, mari kita teliti contoh khusus anda.
Taman Permainan On the Go, dengan GOMAXPROCS pada mulanya ditetapkan kepada 1, kod yang anda berikan dijangka menghasilkan ralat "Proses mengambil masa terlalu lama". Ini kerana goroutine yang dibuat dalam fungsi other() melaksanakan gelung tak terhingga, menghalang goroutine utama daripada meneruskan dan menerima data daripada saluran yang telah selesai.
Walau bagaimanapun, pada mesin tempatan anda, nilai GOMAXPROCS mungkin ditetapkan kepada nombor yang lebih tinggi (cth., bilangan teras CPU yang tersedia). Ini membolehkan berbilang goroutine berjalan serentak. Dalam kes anda, goroutine utama menerima data daripada saluran selesai manakala goroutine yang lain menjalankan gelung tak terhingga secara selari. Setelah data diterima, goroutine utama meneruskan dan menamatkan program, tanpa mengira goroutine lain yang masih berjalan.
Tingkah laku bukan penentu ini wujud dalam model memori Go. Urutan pelaksanaan goroutin tidak dijamin, melainkan mekanisme penyegerakan yang jelas digunakan.
Penjelasan:
Di Taman Permainan Go, GOMAXPROCS ditetapkan kepada 1. Ini bermakna bahawa hanya satu goroutine boleh berjalan pada satu masa. Dalam kod anda, goroutine utama melaksanakan fungsi main() dan mencipta goroutine kedua yang melaksanakan fungsi lain(). Goroutine utama kemudian menunggu pada saluran yang telah selesai, yang disekat.
Memandangkan hanya satu goroutine boleh dijalankan pada satu masa, penjadual memilih untuk terus menjalankan fungsi lain(). Fungsi ini menghantar nilai pada saluran selesai, menjadikan kedua-dua arus (other()) dan goroutine utama boleh dijalankan. Walau bagaimanapun, penjadual terus menjalankan other(), memandangkan GOMAXPROCS=1.
Other() kemudian melancarkan goroutine lain yang melaksanakan gelung tidak berkesudahan. Penjadual memilih untuk melaksanakan goroutine ini, yang mengambil masa selama-lamanya untuk mencapai keadaan yang disekat. Akibatnya, fungsi main() tidak diteruskan dan program berjalan selama-lamanya, menyebabkan ralat "Proses mengambil masa terlalu lama" di Go Playground.
Secara tempatan, GOMAXPROCS berkemungkinan besar daripada 1. Ini membenarkan berbilang goroutine untuk berjalan serentak. Sebaik sahaja other() menghantar data ke saluran selesai, penjadual boleh bertukar kepada goroutine utama, yang meneruskan untuk menyelesaikan dan menamatkan program. Walaupun goroutine lain masih berjalan, program akan keluar apabila goroutine utama ditamatkan.
Atas ialah kandungan terperinci Mengapa Goroutine Berkelakuan Berbeza di Go Playground vs. Mesin Tempatan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!