ホームページ > バックエンド開発 > Golang > golang 関数と goroutine のリソース割り当て

golang 関数と goroutine のリソース割り当て

王林
リリース: 2024-04-25 12:42:02
オリジナル
1085 人が閲覧しました

関数は実行中にリソースを割り当て、実行後に自動的に解放されます。一方、ゴルーチンは作成時にリソースを割り当てますが、メモリ リークやパフォーマンスの低下を防ぐために明示的に閉じるか、コンテキストまたは WaitGroup を使用して確実に解放する必要があります。

golang 関数と goroutine のリソース割り当て

Golang 関数とゴルーチンの実践的なリソース割り当て

はじめに

Go 言語では、関数とゴルーチンは一般的に使用される同時実行性のメカニズムです。 。関数はコードの実行単位であり、ゴルーチンは同時に実行される関数です。プログラムのパフォーマンスを最適化し、リソースの無駄を防ぐには、関数とゴルーチンにリソースを適切に割り当てることが重要です。

関数のリソース割り当て

関数は実行中にのみリソースを占有し、実行後にすべてのリソースを自動的に解放します。 defer ステートメントを使用すると、関数が戻る前にリソースを確実に解放できます。例:

func cleanup() {
  // 释放资源
}

func main() {
  defer cleanup()
  // 执行代码
}
ログイン後にコピー

Goroutine のリソース割り当て

関数とは異なり、Goroutine は作成時にリソースを割り当てます。これらのリソースは、Goroutine が終了するまで解放されません。 goroutine のリリースが間に合わないと、メモリ リークやパフォーマンスの低下が発生します。

ゴルーチンがリソースを確実に解放するには、いくつかの方法があります:

  • チャネルとその他のリソースを明示的に閉じる:

    c := make(chan int)
    // 使用 channel
    close(c)
    ログイン後にコピー
  • Use context.Done():

    ctx, cancel := context.WithCancel(context.Background())
    // 使用 context
    cancel()
    ログイン後にコピー
  • WaitGroup# を通じて goroutine を待機します## 終了:

    var wg sync.WaitGroup
    wg.Add(1)
    go func() {
      // 执行代码
      wg.Done()
    }()
    wg.Wait()
    ログイン後にコピー

実用的なケース

次の例では、非同期タスクを実行する複数のゴルーチンを作成します:

package main

import (
  "context"
  "fmt"
  "sync"
)

func main() {
  ctx, cancel := context.WithCancel(context.Background())

  var wg sync.WaitGroup
  for i := 0; i < 10; i++ {
    wg.Add(1)
    go func(i int) {
      defer wg.Done()
      fmt.Println("Goroutine", i)

      // 使用 ctx 来响应取消请求
      select {
        case <-ctx.Done():
          fmt.Println("Goroutine", i, "cancelled")
          return
        default:
          // 继续执行任务
      }
    }(i)
  }

  // 取消所有 goroutine
  cancel()
  wg.Wait()
}
ログイン後にコピー

Runこのプログラムの出力は次のとおりです。

Goroutine 0
Goroutine 1
Goroutine 2
Goroutine 3
Goroutine 4
Goroutine 5
Goroutine 0 cancelled
Goroutine 1 cancelled
Goroutine 2 cancelled
Goroutine 3 cancelled
Goroutine 4 cancelled
Goroutine 5 cancelled
Goroutine 6
Goroutine 7
Goroutine 8
Goroutine 9
Goroutine 6 cancelled
Goroutine 7 cancelled
Goroutine 8 cancelled
Goroutine 9 cancelled
ログイン後にコピー
出力からわかるように、

cancel() 関数が呼び出されると、すべてのゴルーチンが時間内にリソースを解放します。

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

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート