ホームページ  >  記事  >  バックエンド開発  >  golang 関数と goroutine の連携

golang 関数と goroutine の連携

PHPz
PHPzオリジナル
2024-04-29 12:06:01390ブラウズ

Go プログラミングでは、関数とゴルーチンが連携して同時実行性を実現します。ゴルーチンは関数内に作成され、関数のローカル変数はゴルーチン内で表示されます。 goroutine は、実際の戦闘で、同時ファイルのアップロードなどの同時処理タスクに使用でき、異なるファイルのアップロードを担当する goroutine を作成することで効率を向上できます。 goroutine を使用する場合は、リソース不足を避けるために適切な量の goroutine を作成してください。goroutine には戻り値がなく、結果を取得するには同時実行プリミティブを使用する必要があります。goroutine を直接停止したりキャンセルしたりすることはできません。

golang 関数と goroutine の連携

Go 関数と Goroutine 間の連携

Go プログラミング言語における goroutine は、コードを実行する軽量のスレッドを作成できる同時実行メカニズムです。関数とゴルーチンは連携して効率的な同時プログラミングを実現します。

関数とゴルーチンの間の接続

ゴルーチンは関数内で作成でき、関数内のローカル変数と定数はゴルーチン内で表示されます。 Goroutine が終了すると、そのローカル変数と定数はリサイクルされます。

次の例は、ゴルーチンを作成し、関数にパラメータを渡す方法を示しています。

package main

import (
    "fmt"
    "time"
)

func printHello(name string) {
    fmt.Printf("Hello, %s!\n", name)
}

func main() {
    go printHello("World")
    time.Sleep(1 * time.Second)
}

上の例では、main 関数はゴルーチンを作成し、パラメータを渡します。 ### "世界"###。 goroutine は printHello 関数を実行し、"Hello, World!\n" を出力します。 実用的なケース: ファイルの同時アップロード

複数のファイルの同時アップロードが必要なユースケースを考えてみましょう:

package main

import (
    "context"
    "fmt"
    "io"
    "os"
    "path/filepath"
    "time"

    "cloud.google.com/go/storage"
)

func uploadFile(w io.Writer, bucketName, objectName string) error {
    ctx := context.Background()
    client, err := storage.NewClient(ctx)
    if err != nil {
        return fmt.Errorf("storage.NewClient: %v", err)
    }
    defer client.Close()

    f, err := os.Open(objectName)
    if err != nil {
        return fmt.Errorf("os.Open: %v", err)
    }
    defer f.Close()

    ctx, cancel := context.WithTimeout(ctx, time.Second*30)
    defer cancel()

    o := client.Bucket(bucketName).Object(objectName)
    wc := o.NewWriter(ctx)
    if _, err := io.Copy(wc, f); err != nil {
        return fmt.Errorf("io.Copy: %v", err)
    }
    if err := wc.Close(); err != nil {
        return fmt.Errorf("Writer.Close: %v", err)
    }
    fmt.Fprintf(w, "File %v uploaded to %v.\n", objectName, bucketName)
    return nil
}

func main() {
    bucketName := "bucket-name"
    objectNames := []string{"file1.txt", "file2.txt", "file3.txt"}

    for _, objectName := range objectNames {
        go uploadFile(os.Stdout, bucketName, objectName)
    }
}

この場合、

main

関数ゴルーチンのリストが作成されます。各ゴルーチンはオペレーティング システムからファイルを読み取り、Google Cloud Storage にアップロードします。これにより、アプリケーションは複数のファイルを同時にアップロードできるようになり、パフォーマンスが大幅に向上します。 注意事項

Goroutine を使用する場合は、次の点に注意する必要があります。

Goroutine は軽量なので、大量の Goroutine を簡単に作成できます。ゴルーチンを作成しすぎてプログラムのリソースが枯渇しないように注意してください。
  • Goroutine は戻り値なしで終了します。 goroutine の結果を取得したい場合は、チャネルまたは他の同時実行プリミティブを使用します。
  • Goroutine は匿名であるため、個々の Goroutine を直接停止したりキャンセルしたりすることはできません。

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

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