Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk melakukan Baca tanpa menyekat () pada io.PipeRaeder di Golang

Bagaimana untuk melakukan Baca tanpa menyekat () pada io.PipeRaeder di Golang

WBOY
Lepaskan: 2024-02-10 11:10:17
ke hadapan
428 orang telah melayarinya

如何在 Golang 中对 io.PipeRaeder 进行非阻塞 Read()

Di Golang, io.PipeReader ialah pembaca yang biasa digunakan, tetapi kaedah Read()nya menyekat pelaksanaan program apabila tiada data untuk dibaca. Jadi bagaimana untuk melaksanakan bacaan tidak menyekat io.PipeReader? Editor PHP Xiaoxin memberi anda penyelesaian Dengan menggunakan pilih dan goroutine, kami boleh mencapai bacaan io.PipeReader tanpa menyekat, dengan itu meningkatkan responsif dan keselarasan program. Berikut akan memperkenalkan secara terperinci cara melaksanakan fungsi ini dan memberikan kod sampel.

Kandungan soalan

Saya ada kod berikut. Selepas 5 saat, boleh laku akan menghantar beberapa teks ke stdout. Oleh itu, in.readline() akan menyekat sehingga data diterima. Bagaimanakah saya boleh menetapkan tamat masa untuk readline() atau melaksanakannya dengan cara yang tidak menyekat?

package main

import (
    "bufio"
    "fmt"
    "io"
    "os/exec"
)

func main() {
    cmd := exec.Command("/path/to/executable")

    stdoutReader, stdoutWriter := io.Pipe()

    cmd.Stdout = stdoutWriter

    cmd.Start()

    in := bufio.NewReader(stdoutReader)
    b, _, _ := in.ReadLine()

    fmt.Println(string(b))
}

Salin selepas log masuk

Penyelesaian

Terima kasih atas komen anda. saya nampak.

package main

import (
    "bufio"
    "fmt"
    "io"
    "os/exec"
    "time"
)

func main() {
    ch := make(chan []byte)
    cmd := exec.Command("/path/to/executable")
    stdoutReader, stdoutWriter := io.Pipe()

    cmd.Stdout = stdoutWriter

    if err := cmd.Start(); err != nil {
        return
    }

    in := bufio.NewReader(stdoutReader)

    go func() {
        b, _, _ := in.ReadLine()
        ch <- b
    }()

    complete := false
    for !complete {
        select {
        case s := <-ch:
            fmt.Println(string(s))
            complete = true
        case <-time.After(time.Second * 5):
            fmt.Println("timeout")
            complete = true
        }
    }

}

Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk melakukan Baca tanpa menyekat () pada io.PipeRaeder di Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:stackoverflow.com
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