関数を使用して非同期操作を処理する手順は、次の 3 つのステップに分かれています。 コード ブロックを同時に実行するコルーチンを作成します。チャネルを使用して、コルーチン間で結果やエラーなどのデータを送信します。コルーチンを使用して非同期タスクを実行し、チャネルから結果を受け取ります。
Golang では、関数を使用して非同期操作を処理するのが一般的なパターンです。関数はコルーチンとして実行できるため、メインスレッドをブロックすることなくコードのブロックを同時に実行できます。
コルーチンは、新しいオペレーティング システム スレッドを作成せずにコードを同時に実行できる軽量のスレッドです。コルーチンは、go
キーワードと、その後に実行される関数によって作成されます。
go func() { // 异步代码在此处执行 }
チャネルは、で使用される通信メカニズムです。コルーチンとメインスレッド間、または異なるコルーチン間でデータを送信します。
非同期操作の場合、チャネルを使用してコルーチン実行の結果またはエラーを受信できます。
result := make(chan int) go func() { // 异步代码在此处执行 result <- resultValue }
一連の URL を同時にクロールする実際のケースを考えてみましょう。
package main import ( "fmt" "io/ioutil" "net/http" ) func main() { urls := []string{"url1", "url2", "url3"} results := make(chan string) // 为每个 URL 创建一个协程 for _, url := range urls { go func(url string) { // 爬取网页并发送结果到信道 resp, err := http.Get(url) if err != nil { results <- fmt.Sprintf("Error getting %s: %v", url, err) return } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { results <- fmt.Sprintf("Error reading body of %s: %v", url, err) return } results <- fmt.Sprintf("Got body of %s: %s", url, string(body)) }(url) } // 从信道接收结果并打印 for i := 0; i < len(urls); i++ { fmt.Println(<-results) } }
非同期操作は、コルーチンとチャネルを使用して Golang で簡単に処理できます。これは、同時タスクの処理、パフォーマンスの向上、メインスレッドのブロックの回避に役立ちます。
以上がGolang 関数を使用して非同期操作を処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。