Rumah > pembangunan bahagian belakang > Golang > Bolehkah Bacaan Go TCP Dibuat Sekatan?

Bolehkah Bacaan Go TCP Dibuat Sekatan?

Barbara Streisand
Lepaskan: 2024-11-03 00:33:29
asal
304 orang telah melayarinya

Can Go TCP Reads Be Made Blocking?

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>
Salin selepas log masuk

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:

  • Menggunakan io.Reader: Antara muka io.Reader menyediakan operasi membaca menyekat. Dengan membungkus sambungan TCP dalam io.Reader, anda boleh membaca daripada sambungan dengan cara menyekat.
  • Menggunakan konteks.Konteks: Jenis konteks.Konteks boleh digunakan untuk menentukan tamat masa untuk operasi baca. Jika tamat masa tamat, operasi baca akan mengembalikan ralat.
  • Menggunakan goroutine: Anda boleh menggunakan goroutine yang berasingan untuk mengendalikan bacaan daripada sambungan TCP. Ini membolehkan anda mengawal tingkah laku menyekat dan mengelak daripada menyekat urutan utama.

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan