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

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

WBOY
WBOYke hadapan
2024-02-10 11:10:17389semak imbas

如何在 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))
}

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

}

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam