Nicht blockierende E/A in der Go-Sprache kann durch die Verwendung von Pipes erreicht werden: Erstellen Sie eine ungepufferte Pipe: make(chan int) Senden Sie Daten an die Pipe: ch <- 1 Empfangen Sie Daten von der Pipe: val := < -ch Praktischer Fall: Erstellen Sie ein nicht blockierendes Dateileseprogramm
Pipes sind eine effiziente Möglichkeit, in gleichzeitigen Go-Programmen zu kommunizieren. Sie ermöglichen ereignisbasierten Code, bei dem jede Phase unabhängig ausgeführt wird, während Daten asynchron durch die Pipeline fließen. In diesem Artikel wird gezeigt, wie Sie Pipes verwenden, um nicht blockierende E/A in der Go-Sprache zu implementieren.
Das Erstellen einer Pipe ist sehr einfach: eine ungepufferte Pipe vom Typ
package main import "fmt" func main() { ch := make(chan int) }
make(chan int)
创建一个可以容纳 int
. Ungepuffert bedeutet, dass Daten sofort von einer Coroutine zur anderen übertragen werden, was für leistungsstarke I/O-Anwendungen von entscheidender Bedeutung ist.
Daten an die Pipe senden:
ch <- 1
Daten von der Pipe empfangen:
val := <-ch
Lassen Sie uns ein nicht blockierendes Dateileseprogramm erstellen. Angenommen, der Dateiinhalt lautet:
Hello World
package main import ( "fmt" "bufio" "os" ) func main() { ch := make(chan string) file, err := os.Open("file.txt") if err != nil { fmt.Println(err) return } defer file.Close() go func() { scanner := bufio.NewScanner(file) for scanner.Scan() { ch <- scanner.Text() } ch <- "" // 标记文件读完 }() // 从管道中以非阻塞方式读取行 for { line := <-ch if line == "" { break } fmt.Println(line) } }
Das Programm erstellt eine Pipe zum Übertragen der Dateizeilen. Eine Coroutine ist für das Lesen aus der Datei und das Senden von Zeilen an die Pipe verantwortlich. Die Haupt-Coroutine empfängt dann die Zeilen von der Pipe, und da die Pipe nicht blockierend ist, kann sie auch dann andere Aufgaben ausführen, wenn das Lesen der Datei noch nicht abgeschlossen ist.
Wenn das Lesen der Datei abgeschlossen ist, senden Sie eine leere Zeile, um die Haupt-Coroutine zu benachrichtigen, die Schleife zu verlassen.
Das obige ist der detaillierte Inhalt vonWie verwende ich Pipes in Go für nicht blockierende E/A?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!