Rumah >pembangunan bahagian belakang >Golang >Mengapa Saluran My Go Unbuffered Mencetak Mesej dalam Pesanan Tidak Dijangka?

Mengapa Saluran My Go Unbuffered Mencetak Mesej dalam Pesanan Tidak Dijangka?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-09 03:38:11649semak imbas

Why Does My Go Unbuffered Channel Print Messages in an Unexpected Order?

Memahami Susunan Output Saluran dalam Go

Coretan kod Go yang diberikan melibatkan penggunaan saluran tidak buffer untuk berkomunikasi antara gorouti. Walaupun kod dijangka mencetak "hello" dan kemudian "ping" disebabkan oleh tingkah laku menyekat, ia secara konsisten mencetak "ping" diikuti dengan "hello." Ini menimbulkan persoalan tentang susunan mesej ditulis dan dibaca daripada saluran.

Seperti yang dicadangkan oleh kod, saluran tidak buffer menyekat kedua-dua penghantar dan penerima sehingga data tersedia. Ini bermakna bahawa apabila rutin go cuba menulis ke saluran, mereka akan menyekat sehingga mesej dibaca.

Setelah pelaksanaan, kod itu memotong rutin dua go yang cuba menulis "hello" dan "ping" ke saluran itu. Memandangkan tiada penerima tersedia serta-merta, kedua-dua rutin menyekat.

Apabila operasi baca pertama (msg := <-messages) berlaku, atur cara tidak akan sewenang-wenangnya memilih goroutine menunggu. Sebaliknya, ia akan memilih yang telah menulis ke saluran. Ini menerangkan sebab "ping" sentiasa diberikan kepada msg, kerana ia sentiasa ditulis sebelum "hello."

Oleh itu, susunan mesej yang dicetak ditentukan oleh susunan pelaksanaan goroutine, yang bukan penentu. Dengan menambahkan pernyataan cetakan pada goroutine yang menulis pada saluran, seseorang boleh mengesahkan bahawa susunan penulisan sepadan dengan susunan mesej yang dibaca daripada saluran.

Atas ialah kandungan terperinci Mengapa Saluran My Go Unbuffered Mencetak Mesej dalam Pesanan Tidak Dijangka?. 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