ホームページ  >  記事  >  バックエンド開発  >  Golang関数の同期・非同期実装方法

Golang関数の同期・非同期実装方法

WBOY
WBOYオリジナル
2023-05-18 08:23:091971ブラウズ

Golang は、同時プログラミングをサポートする高級プログラミング言語です。豊富な同時プログラミング メカニズムと構文機能を提供し、開発者が複雑なマルチスレッドまたはマルチコルーチン プログラムを実装しやすくします。このうち同期と非同期は並行プログラミングでよく使われる2つの手法であり、この記事ではGolang関数の同期と非同期の実装方法とその利用シーンを紹介します。

1. 同期関数の実装方法

同期関数とは、関数の実行中に関数が結果を返すのを待ってから次の操作を続行することを意味します。 Golangでは、よく使われる同期機能の実装方法は以下のとおりです。

1. ブロッキング呼び出し

ブロッキング呼び出しは、同期関数を実装するために最も一般的に使用される方法です。つまり、関数が呼び出されると、関数が実行を完了して関数が返されるまで、プログラムはブロックされます。続行する前に結果が表示されます。次のステップ。たとえば、次のコードの f 関数はブロッキング呼び出しです。

func f() int {
    time.Sleep(time.Second * 5)
    return 42
}

func main() {
    x := f()
    fmt.Println(x)
}

上記のコードの f 関数は、時間のかかる操作をシミュレートし、結果を返すまでに 5 秒かかります。 f 関数が main 関数で呼び出される場合、プログラムは常にブロックされ、f 関数が実行を完了して結果を返すまで待機してから、次のステップに進みます。

2. マルチスレッド同期

Golang は、複数のスレッドを使用してタスクを並行して実行できるマルチスレッド プログラミング メカニズムを提供します。複数のスレッドが同じリソースに同時にアクセスする場合、競合状態を回避するために同期操作が必要になります。一般的な同期方法には、ミューテックス ロック、条件変数、アトミック操作などが含まれます。以下は、ミューテックスロックを利用してマルチスレッド同期を実現するサンプルコードです:

var count int
var mut sync.Mutex

func increment() {
    mut.Lock()
    count++
    mut.Unlock()
}

func main() {
    for i := 0; i < 1000; i++ {
        go increment()
    }
    time.Sleep(time.Second)
    fmt.Println(count)
}

上記コードにおいて、インクリメント関数はインクリメント演算を行う関数であり、ミューテックスロックにより複数のスレッドで同期を実現します。カウント変数 競合状態を避けるために操作を同期させます。プログラムは、複数のスレッドを通じてインクリメント関数を 1000 回並列実行し、最終的に count の値を出力します。

2. 非同期関数の実装方法

非同期関数とは、関数の実行中に、プログラムが関数から結果が返されるのを待たずに、直接次の処理を続行することを意味します。手術。関数が実行されると、結果はコールバック関数またはメッセージ通知を通じてプログラムに渡されます。 Golang では、一般的に使用される非同期関数の実装方法は次のとおりです。

1. コルーチン

コルーチンは、単一のスレッドで複数のコルーチンを同時に実行できる Golang の軽量スレッドです。コルーチンは非常に使いやすく、go キーワードから開始できます。

以下は、コルーチンを使用して非同期関数を実装するためのサンプル コードです。

func f() int {
    time.Sleep(time.Second * 5)
    return 42
}

func main() {
    ch := make(chan int)
    go func() {
        ch <- f()
    }()
    fmt.Println("doing other things")
    x := <-ch
    fmt.Println(x)
}

上記のコードでは、ch チャネルを使用して非同期操作を実装しています。 main関数内でコルーチンを起動し、f関数の実行結果をチャネルch経由でメインプログラムに渡します。メインプログラムで他の操作が実行された後、f 関数の実行結果がチャネルを通じて受信され、非同期操作が完了します。

2. コールバック関数

コールバック関数とは、非同期関数の実行後に、あらかじめ登録されたコールバック関数を呼び出して結果をプログラムに渡すことを指します。以下は、コールバック関数を使用して非同期関数を実装するサンプル コードです。

func f(callback func(int)) {
    time.Sleep(time.Second * 5)
    callback(42)
}

func main() {
    f(func(x int) {
        fmt.Println(x)
    })
    fmt.Println("doing other things")
}

上記のコードでは、 f 関数はコールバック関数を使用して非同期操作を実装します。あらかじめ登録されたコールバック関数を呼び出すことで、f関数の実行結果がプログラムに渡されます。メインプログラムで他の演算が行われた後、f 関数の実行結果が出力されます。

3. 同期および非同期の使用シナリオ

同期関数と非同期関数にはそれぞれ長所と短所があるため、特定のビジネス ニーズに応じて選択する必要があります。

http リクエストの操作など、特定の関数の実行結果を単純に取得したい場合には、同期関数がよく使用されます。時間のかかる操作を実行する必要がある場合、または複数のタスクを同時に操作する必要がある場合は、非同期関数の方が適しています。たとえば、大きなファイルをダウンロードする場合、非同期関数を使用して同時ダウンロードを実装し、ダウンロード速度を向上させることができます。また、ネットワーク リクエストを処理する場合、非同期関数を使用してリクエストを処理し、待ち時間を短縮することができます。

つまり、同期関数と非同期関数はさまざまなシナリオでより良い使用効果があり、実際の状況に応じて選択する必要があります。

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

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