Bagaimana untuk menggunakan paip dalam Go untuk I/O tidak menyekat?

WBOY
Lepaskan: 2024-06-01 12:14:56
asal
708 orang telah melayarinya

I/O yang tidak menyekat dalam bahasa Go boleh dicapai dengan menggunakan paip: Cipta paip yang tidak terbuffer: make(chan int) Hantar data ke paip: ch <- 1 Terima data daripada paip: val := < -ch Kes praktikal : Buat program membaca fail tanpa sekat

如何使用 Go 语言中的管道进行非阻塞 I/O?

Bagaimana untuk menggunakan paip dalam bahasa Go untuk I/O tidak menyekat?

Paip ialah cara yang cekap untuk berkomunikasi dalam program Go serentak. Mereka membenarkan kod berasaskan acara, di mana setiap peringkat berjalan secara bebas manakala data mengalir secara tidak segerak melalui saluran paip. Artikel ini akan menunjukkan cara menggunakan paip untuk melaksanakan I/O tanpa sekatan dalam bahasa Go.

Penciptaan dan penggunaan paip

Membuat paip adalah sangat mudah: jenis paip tanpa penimbal

package main

import "fmt"

func main() {
    ch := make(chan int)
}
Salin selepas log masuk

make(chan int) 创建一个可以容纳 int. Tanpa penimbal bermakna data dipindahkan dari satu coroutine ke coroutine yang lain serta-merta, yang penting untuk aplikasi I/O berprestasi tinggi.

Hantar data ke paip:

ch <- 1
Salin selepas log masuk

Terima data daripada paip:

val := <-ch
Salin selepas log masuk

Kes praktikal: bacaan fail

Mari buat program membaca fail tanpa menyekat. Andaikan kandungan fail ialah:

Hello
World
Salin selepas log masuk
package main

import (
    "fmt"
    "bufio"
    "os"
)

func main() {
    ch := make(chan string)

    file, err := os.Open("file.txt")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer file.Close()

    go func() {
        scanner := bufio.NewScanner(file)
        for scanner.Scan() {
            ch <- scanner.Text()
        }
        ch <- "" // 标记文件读完
    }()

    // 从管道中以非阻塞方式读取行
    for {
        line := <-ch
        if line == "" {
            break
        }
        fmt.Println(line)
    }
}
Salin selepas log masuk

Atur cara mencipta paip untuk memindahkan baris fail. Coroutine bertanggungjawab untuk membaca dari fail dan menghantar talian ke paip. Coroutine utama kemudiannya menerima talian daripada paip, dan memandangkan paip tidak menyekat, ia boleh terus melaksanakan tugas lain walaupun bacaan fail tidak lengkap.

Apabila bacaan fail selesai, hantar baris kosong untuk memberitahu coroutine utama untuk keluar dari gelung.

Atas ialah kandungan terperinci Bagaimana untuk menggunakan paip dalam Go untuk I/O tidak menyekat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!