ホームページ  >  記事  >  バックエンド開発  >  さまざまな同時実行ライブラリでの golang 関数と goroutine の実装

さまざまな同時実行ライブラリでの golang 関数と goroutine の実装

WBOY
WBOYオリジナル
2024-04-25 13:30:021090ブラウズ

Go 言語では、関数とゴルーチンが同時プログラミングを実装します。 Go 関数は go キーワードを使用して同時に実行できます。Goroutine は、新しいスタックを割り当てて指定された関数を実行することで同時実行性を実現する軽量のスレッドです。実際のケースでは、ミューテックス ロック (同期パッケージ) はデータの競合を防ぐために使用され、コンテキスト (コンテキスト パッケージ) は同時実行機能のキャンセルと期限切れを制御するために使用されます。

さまざまな同時実行ライブラリでの golang 関数と goroutine の実装

さまざまな同時実行ライブラリでの Go 関数と Goroutine の実装

Go は、開発者が同時実行プログラムを実行できるようにするさまざまな同時実行プリミティブを提供します。簡単に書くことができます。この記事では、最も一般的に使用される 2 つの同時実行ライブラリについて説明します。

  • #sync パッケージ: ミューテックス (Mutex) や条件変数 (Cond) などの基本的な同期タイプが含まれています。 )。
  • context パッケージ : リクエストまたは操作の有効期限とキャンセルを管理するために使用されます。

Function

Go 関数は並列実行できるため、同時実行性が実現します。同時関数は、次の構文を使用して作成できます。

go func() {
    // 并发执行的代码
}

Goroutine

Goroutine は、同時に実行できる Go の軽量スレッドです。 Goroutine が作成されると、新しいスタックが割り当てられ、指定された関数の実行が開始されます。 Goroutine は、次の構文を使用して作成できます。

go func() {
    // 并发执行的代码
}()

実際のケース: ミューテックス ロック

ミューテックス ロックは、共有リソースへのアクセスを調整し、データの競合を防ぐために使用されます。 sync パッケージは、共有変数を保護するために使用できる Mutex タイプを提供します。

import (
    "sync"
    "fmt"
)

var (
    count int
    mu sync.Mutex
)

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

func main() {
    for i := 0; i < 1000; i++ {
        go increment()
    }
    fmt.Println(count) // 输出: 1000
}

実用的なケース: コンテキスト

コンテキストは、リクエストまたは操作のキャンセル ステータスを渡すために使用されます。 context パッケージには、同時関数の制御に使用できる Context および CancelFunc タイプが用意されています。

import (
    "context"
    "fmt"
    "time"
)

func main() {
    // 创建一个 Context,并在 1 秒后取消
    ctx, cancel := context.WithTimeout(context.Background(), time.Second)
    defer cancel()

    go func() {
        // 在 Context 被取消之前,不断打印
        for {
            select {
            case <-ctx.Done():
                fmt.Println("Context cancelled")
                break
            default:
                fmt.Println("Still running...")
                time.Sleep(100 * time.Millisecond)
            }
        }
    }()

    // 等待 Goroutine 完成或 Context 被取消
    <-ctx.Done()
}

異なる同時実行ライブラリでは、関数とゴルーチンの実装が若干異なる場合がありますが、それらの中心となる概念は同じです。同期タイプは共有リソースへのアクセスを調整するために使用され、コンテキストは同時実行機能のキャンセルと期限切れを管理するために使用されます。

以上がさまざまな同時実行ライブラリでの golang 関数と goroutine の実装の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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