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

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

WBOY
Libérer: 2024-02-10 11:10:17
avant
428 Les gens l'ont consulté

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

Copier après la connexion

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

}

Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal