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