Menyekat lwn. Bacaan Tidak Menyekat dalam Go TCP
Dalam Go, bacaan TCP tidak menyekat secara lalai. Ini bermakna fungsi conn.Read() akan kembali serta-merta, walaupun tiada data tersedia untuk dibaca. Tingkah laku ini boleh menjadi masalah untuk kes penggunaan tertentu, seperti semasa menunggu respons khusus daripada pelanggan.
Bolehkah Go TCP Reads Disekat?
While Go TCP bacaan tidak menyekat secara lalai, adalah mungkin untuk menjadikannya menyekat. Ini boleh dicapai dengan menggunakan jenis penyegerakan.Mutex untuk menyegerakkan akses kepada sambungan.
Berikut ialah versi diubah suai kod pelayan yang menggunakan Mutex untuk membuat operasi baca menyekat:
<code class="go">import ( "fmt" "log" "net" "sync" ) func main() { tcp := Init_tcp() conn, _ := tcp.Accept() data := make([]byte, 512) var m sync.Mutex for { m.Lock() conn.Read(data) m.Unlock() fmt.Println(data) } }</code>
Dalam contoh ini, penyegerakan.Mutex memastikan bahawa hanya satu goroutine boleh mengakses sambungan pada satu masa. Ini menghalang data daripada dirosakkan oleh berbilang goroutine membaca daripada sambungan secara serentak.
Alternatif untuk Menyekat Bacaan
Semasa menggunakan Mutex boleh menjadikan TCP menyekat bacaan, ia adalah penting untuk ambil perhatian bahawa ini bukan pendekatan yang disyorkan. Operasi menyekat boleh membawa kepada isu prestasi dan situasi kebuntuan. Sebaliknya, secara amnya adalah lebih baik untuk menggunakan pendekatan alternatif, seperti:
Kesimpulan
Walaupun mungkin untuk membuat penyekatan bacaan TCP dalam Go, ia tidak disyorkan. Sebaliknya, pertimbangkan untuk menggunakan pendekatan alternatif seperti io.Reader, context.Context atau goroutine untuk mengendalikan gelagat menyekat dengan lebih cekap.
Atas ialah kandungan terperinci Bolehkah Bacaan Go TCP Dibuat Sekatan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!