Maison  >  Article  >  développement back-end  >  Comment faire Read() non bloquant sur io.PipeRaeder dans Golang

Comment faire Read() non bloquant sur io.PipeRaeder dans Golang

WBOY
WBOYavant
2024-02-10 11:10:17393parcourir

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

Dans Golang, io.PipeReader est un lecteur couramment utilisé, mais sa méthode Read() bloquera l'exécution du programme lorsqu'il n'y a pas de données à lire. Alors comment implémenter la lecture non bloquante de io.PipeReader ? L'éditeur PHP Xiaoxin vous propose une solution. En utilisant select et goroutine, nous pouvons réaliser une lecture non bloquante de io.PipeReader, améliorant ainsi la réactivité et la concurrence du programme. Ce qui suit présentera en détail comment implémenter cette fonction et donnera un exemple de code.

Contenu de la question

J'ai le code suivant. Après 5 secondes, l'exécutable enverra du texte à la sortie standard. Par conséquent, in.readline() bloquera jusqu'à ce que les données soient reçues. Comment puis-je définir un délai d'attente pour readline() ou l'exécuter de manière non bloquante ?

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

Solution

Merci pour votre commentaire. Je vois.

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

}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer