Go 言語のノンブロッキング I/O は、パイプを使用して実現できます。 バッファーのないパイプを作成します: make(chan int) パイプにデータを送信します: ch
パイプは、同時 Go プログラムで通信する効率的な方法です。これにより、データがパイプラインを非同期的に流れながら、各ステージが独立して実行されるイベントベースのコードが可能になります。この記事では、パイプを使用して Go 言語でノンブロッキング I/O を実装する方法を説明します。
パイプの作成は非常に簡単です。タイプ
package main import "fmt" func main() { ch := make(chan int) }
make(chan int)
创建一个可以容纳 int
のバッファなしパイプです。バッファリングされないということは、データが 1 つのコルーチンから別のコルーチンに即座に転送されることを意味し、これは高性能 I/O アプリケーションにとって重要です。
パイプにデータを送信する:
ch <- 1
パイプからデータを受信する:
val := <-ch
ノンブロッキングのファイル読み取りプログラムを作成しましょう。ファイルの内容が次のとおりであると仮定します。
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) } }
プログラムは、ファイル行を転送するためのパイプを作成します。コルーチンは、ファイルからの読み取りとパイプへの行の送信を担当します。メイン コルーチンはパイプから行を受け取ります。パイプはノンブロッキングであるため、ファイルの読み取りがまだ完了していなくても、他のタスクの実行を続けることができます。
ファイルの読み取りが完了したら、空の行を送信して、メインのコルーチンにループを終了するように通知します。
以上がGo でノンブロッキング I/O のためにパイプを使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。