Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Peruntukan sumber fungsi golang dan goroutine

Peruntukan sumber fungsi golang dan goroutine

王林
王林asal
2024-04-25 12:42:021046semak imbas

Fungsi memperuntukkan sumber semasa pelaksanaan dan melepaskannya secara automatik selepas pelaksanaan; manakala goroutine memperuntukkan sumber apabila ia dicipta dan perlu ditutup secara eksplisit atau menggunakan konteks atau WaitGroup untuk memastikan pelepasan untuk mengelakkan kebocoran memori dan kemerosotan prestasi.

Peruntukan sumber fungsi golang dan goroutine

Peruntukan sumber praktikal fungsi Golang dan Goroutines

Pengenalan

Dalam bahasa Go, fungsi dan goroutin adalah mekanisme serentak yang biasa digunakan. Fungsi ialah unit pelaksanaan kod, dan goroutine ialah fungsi yang dilaksanakan secara serentak. Peruntukan sumber yang betul kepada fungsi dan goroutin adalah penting untuk mengoptimumkan prestasi program dan mencegah pembaziran sumber.

Peruntukan sumber fungsi

Fungsi hanya menduduki sumber semasa pelaksanaan dan secara automatik mengeluarkan semua sumber selepas pelaksanaan. Anda boleh memastikan bahawa sumber dikeluarkan sebelum fungsi kembali dengan menggunakan pernyataan tunda. Contohnya: defer 语句来确保资源在函数返回前释放。例如:

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

func main() {
  defer cleanup()
  // 执行代码
}

Goroutine 的资源分配

与函数不同,goroutine 在创建时分配资源,并且直到 goroutine 退出才释放这些资源。如果不及时释放 goroutine,会导致内存泄漏和性能下降。

有几种方法可以确保 goroutine 释放资源:

  • 显式关闭 channel 和 other 资源:

    c := make(chan int)
    // 使用 channel
    close(c)
  • 使用 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()

实战案例

在以下示例中,我们创建了多个 goroutine 来执行异步任务:

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()rrreee

Peruntukan sumber Goroutine🎜🎜Tidak seperti fungsi, goroutine memperuntukkan sumber apabila ia dicipta dan sumber ini tidak dikeluarkan sehingga goroutine keluar. Jika goroutine tidak dikeluarkan tepat pada masanya, kebocoran memori dan kemerosotan prestasi akan berlaku. 🎜🎜Terdapat beberapa cara untuk memastikan goroutine mengeluarkan sumber: 🎜
  • 🎜Tutup saluran dan sumber lain secara eksplisit: 🎜rrreee
  • 🎜Gunakan konteks.Selesai():🎜rrreee
  • 🎜Menunggu goroutine untuk keluar melalui WaitGroup:🎜 rrreee li>
🎜Kes praktikal🎜🎜Dalam contoh berikut, kami mencipta berbilang goroutin untuk melaksanakan tugas tak segerak:🎜rrreee🎜Menjalankan program ini, output adalah seperti berikut:🎜rrreee🎜Seperti yang dapat dilihat daripada output, apabila cancel() dipanggil, semua goroutine mengeluarkan sumber dalam masa. 🎜

Atas ialah kandungan terperinci Peruntukan sumber fungsi golang dan goroutine. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn