Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk menggunakan paip dalam Go untuk I/O tidak menyekat?

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

WBOY
WBOYasal
2024-06-01 12:14:56761semak imbas

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)
}

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

Terima data daripada paip:

val := <-ch

Kes praktikal: bacaan fail

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

Hello
World
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)
    }
}

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!

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