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

Peruntukan sumber fungsi golang dan goroutine

王林
Lepaskan: 2024-04-25 12:42:02
asal
1137 orang telah melayarinya

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()
  // 执行代码
}
Salin selepas log masuk

Goroutine 的资源分配

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

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

  • 显式关闭 channel 和 other 资源:

    c := make(chan int)
    // 使用 channel
    close(c)
    Salin selepas log masuk
  • 使用 context.Done()

    ctx, cancel := context.WithCancel(context.Background())
    // 使用 context
    cancel()
    Salin selepas log masuk
  • 通过 WaitGroup 等待 goroutine 退出:

    var wg sync.WaitGroup
    wg.Add(1)
    go func() {
      // 执行代码
      wg.Done()
    }()
    wg.Wait()
    Salin selepas log masuk

实战案例

在以下示例中,我们创建了多个 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()
}
Salin selepas log masuk

运行此程序,输出如下:

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
Salin selepas log masuk

从输出中可以看出,当 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!

Label berkaitan:
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan