golangの非同期実装

May 16, 2023 pm 02:18 PM

インターネット技術の継続的な発展に伴い、コンピュータープログラミング言語も常に更新され、改良されています。比較的新しいプログラミング言語である Go 言語 (略して golang) は、その高い同時実行性と優れたメモリ管理により、ますます多くの開発者に好まれています。 golang では、非同期呼び出しの実装は非常に一般的な要件です。この記事では、golang での非同期呼び出しの実装について詳しく説明します。

1. golang の非同期呼び出しの概念

コンピューター プログラムは一般的にコード シーケンスに従って順番に実行されることは誰もが知っていますが、実際のアプリケーション プロセスでは、多くの場合、複数のタスクを実行する必要があります。これを行うとき、非同期呼び出しの概念を導入します。非同期呼び出しは、同時実行の方法です。つまり、プログラムは、各タスクの終了を待たずに、次のタスクを実行する前に複数のタスクを同時に実行します。非同期呼び出しでは、各タスクは個別のスレッドを開始し、タスクの完了後にメインスレッドに戻るため、他のタスクの通常の実行には影響しません。

golang では、非同期呼び出しの実装が他のプログラミング言語とは異なり、goroutine (コルーチン) を使用して非同期呼び出しを実装します。 Goroutine は、プログラム内に複数のコルーチンを作成できる軽量のスレッドで、各コルーチンは独立しており、同時に実行できます。

2. golang で非同期呼び出しを実装する方法

golang では、goroutine とチャネルを使用して非同期呼び出しの機能を実装できます。

  1. ゴルーチンを使用して非同期呼び出しを実装する

golang では、ゴルーチンを開くのは非常に簡単です。関数の前に go キーワードを追加するだけです。例:

go func() {
    // 执行任务的代码
}()
ログイン後にコピー

上記のコードは、新しい goroutine でタスクを実行します。完全なサンプル コードを見てみましょう:

package main

import (
    "fmt"
    "time"
)

func main() {
    // 开启一个goroutine执行任务
    go func() {
        for i := 0; i < 10; i++ {
            fmt.Println("goroutine执行...", i)
            time.Sleep(1 * time.Second)
        }
    }()

    // 主线程执行任务
    for i := 0; i < 5; i++ {
        fmt.Println("主线程执行...", i)
        time.Sleep(1 * time.Second)
    }

    // 等待一段时间,保证goroutine执行完毕
    time.Sleep(15 * time.Second)
    fmt.Println("程序结束...")
}
ログイン後にコピー

上記のコードを通じて、プログラムが goroutine 実行タスクを開始し、メイン スレッドが同時に別のタスクも実行していることがわかります。プログラムの実行中、メインスレッドとゴルーチンは相互に影響を与えることなく同時に実行できます。

  1. チャネルを使用して非同期呼び出しを実装する

golang では、チャネルはゴルーチン間の通信手段であり、チャネルを使用して非同期呼び出しを実装できます。以下に示すように、バッファーを使用してチャネルを作成し、ゴルーチンでタスクを実行し、その結果をチャネルを通じてメインスレッドに渡すことができます。

package main

import (
    "fmt"
    "time"
)

func main() {
    // 创建一个带缓冲区的channel
    ch := make(chan int, 10)

    // 在goroutine中执行任务,并将结果通过channel传递给主线程
    go func() {
        for i := 0; i < 10; i++ {
            ch <- i
        }
    }()

    // 主线程读取channel中的数据
    for {
        num, ok := <-ch
        if ok {
            fmt.Println("收到数据:", num)
        } else {
            break
        }
    }

    fmt.Println("程序结束...")
}
ログイン後にコピー

上記のコードでは、次のコードを使用してチャネルを作成します。バッファのチャネルを取得してゴルーチン内でタスクを実行し、タスクの結果がチャネルを通じてメインスレッドに渡されます。メインスレッドはループを通じてチャネル内のデータを読み取り、チャネルが閉じられると、ok 変数を使用してループが終了するかどうかを判断し、それによってプログラムが正常に終了できるようにします。

3. golang 非同期呼び出しのアプリケーション シナリオ

実際のアプリケーションでは、非同期呼び出しは次のシナリオでよく使用されます:

  1. ネットワーク リクエスト

ネットワーク通信では、ネットワーク状況が不確実であるため、リクエストの応答時間が非常に長くなる可能性があり、同期呼び出しを使用すると、プログラムが長時間ブロックされ、ユーザー エクスペリエンスに影響を与えます。したがって、非同期呼び出しを使用することで、リクエスト後のレスポンスを待つ必要がなく、他のタスクを継続して実行し、レスポンスが到着するまで待ってから処理することができます。

  1. ファイル操作

一部のファイル操作では、ファイル内容の読み取り、ファイルへの書き込みなど、多数の I/O 操作が必要になる場合があります。これらの I/O 操作には時間がかかり、同期呼び出しが使用される場合、プログラムがブロックされ、非効率になる可能性があります。したがって、ファイル操作に時間がかかる場合は、メインスレッドの通常の動作に影響を与えることなく、非同期呼び出しを使用して goroutine を使用してタスクを実行できます。

  1. スケジュールされたタスク

一部のスケジュールされたタスクでは、時間のかかる操作を実行する必要がある場合があります。同期呼び出しを使用すると、プログラムの時間精度や安定性に影響が出る可能性があります。したがって、非同期呼び出しを使用すると、プログラムの精度や安定性に影響を与えることなく、メインスレッドがスケジュールされたタスクを実行している間に、ゴルーチンが特定の操作タスクを実行できるようになります。

4. 結論

非同期呼び出しは、最新のプログラミング言語で非常に一般的なプログラミング手法であり、プログラムの効率と安定性を高めることができます。強力な同時実行性を持つプログラミング言語である golang は、ゴルーチンとチャネルを介した非同期呼び出しをサポートしており、非常に便利で実用的です。実際のアプリケーションでは、プログラムのパフォーマンスとユーザー エクスペリエンスを向上させるために、特定のシナリオに基づいて適切な非同期呼び出し方法を選択する必要があります。

以上がgolangの非同期実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Debian OpenSSLの脆弱性は何ですか Debian OpenSSLの脆弱性は何ですか Apr 02, 2025 am 07:30 AM

OpenSSLは、安全な通信で広く使用されているオープンソースライブラリとして、暗号化アルゴリズム、キー、証明書管理機能を提供します。ただし、その歴史的バージョンにはいくつかの既知のセキュリティの脆弱性があり、その一部は非常に有害です。この記事では、Debian SystemsのOpenSSLの共通の脆弱性と対応測定に焦点を当てます。 Debianopensslの既知の脆弱性:OpenSSLは、次のようないくつかの深刻な脆弱性を経験しています。攻撃者は、この脆弱性を、暗号化キーなどを含む、サーバー上の不正な読み取りの敏感な情報に使用できます。

Go's Crawler Collyのキュースレッドの問題は何ですか? Go's Crawler Collyのキュースレッドの問題は何ですか? Apr 02, 2025 pm 02:09 PM

Go Crawler Collyのキュースレッドの問題は、Go言語でColly Crawler Libraryを使用する問題を調査します。 �...

GOの浮動小数点番号操作に使用されるライブラリは何ですか? GOの浮動小数点番号操作に使用されるライブラリは何ですか? Apr 02, 2025 pm 02:06 PM

GO言語の浮動小数点数操作に使用されるライブラリは、精度を確保する方法を紹介します...

フロントエンドからバックエンドの開発に変身すると、JavaやGolangを学ぶことはより有望ですか? フロントエンドからバックエンドの開発に変身すると、JavaやGolangを学ぶことはより有望ですか? Apr 02, 2025 am 09:12 AM

バックエンド学習パス:フロントエンドからバックエンドへの探査の旅は、フロントエンド開発から変わるバックエンド初心者として、すでにNodeJSの基盤を持っています...

Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Apr 02, 2025 pm 02:03 PM

Go言語での文字列印刷の違い:printlnとstring()関数を使用する効果の違いはGOにあります...

Debianの下のPostgreSQL監視方法 Debianの下のPostgreSQL監視方法 Apr 02, 2025 am 07:27 AM

この記事では、Debianシステムの下でPostgreSQLデータベースを監視するためのさまざまな方法とツールを紹介し、データベースのパフォーマンス監視を完全に把握するのに役立ちます。 1. PostgreSQLを使用して監視を監視す​​るビューPostgreSQL自体は、データベースアクティビティを監視するための複数のビューを提供します。 PG_STAT_REPLICATION:特にストリームレプリケーションクラスターに適した複製ステータスを監視します。 PG_STAT_DATABASE:データベースサイズ、トランザクションコミット/ロールバック時間、その他のキーインジケーターなどのデータベース統計を提供します。 2。ログ分析ツールPGBADGを使用します

Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Apr 02, 2025 pm 04:54 PM

redisstreamを使用してGo言語でメッセージキューを実装する問題は、GO言語とRedisを使用することです...

Beego ormのモデルに関連付けられているデータベースを指定する方法は? Beego ormのモデルに関連付けられているデータベースを指定する方法は? Apr 02, 2025 pm 03:54 PM

Beegoormフレームワークでは、モデルに関連付けられているデータベースを指定する方法は?多くのBEEGOプロジェクトでは、複数のデータベースを同時に操作する必要があります。 Beegoを使用する場合...

See all articles