関数は実行中にリソースを割り当て、実行後に自動的に解放されます。一方、ゴルーチンは作成時にリソースを割り当てますが、メモリ リークやパフォーマンスの低下を防ぐために明示的に閉じるか、コンテキストまたは WaitGroup を使用して確実に解放する必要があります。
Go 言語では、関数とゴルーチンは一般的に使用される同時実行性のメカニズムです。 。関数はコードの実行単位であり、ゴルーチンは同時に実行される関数です。プログラムのパフォーマンスを最適化し、リソースの無駄を防ぐには、関数とゴルーチンにリソースを適切に割り当てることが重要です。
関数は実行中にのみリソースを占有し、実行後にすべてのリソースを自動的に解放します。 defer
ステートメントを使用すると、関数が戻る前にリソースを確実に解放できます。例:
func cleanup() { // 释放资源 } func main() { defer cleanup() // 执行代码 }
関数とは異なり、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() }
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 サイトの他の関連記事を参照してください。