Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pengurusan dan penjadualan goroutine dalam pengaturcaraan serentak Go

Pengurusan dan penjadualan goroutine dalam pengaturcaraan serentak Go

PHPz
PHPzasal
2024-06-04 16:42:00894semak imbas

Goroutine dalam bahasa Go boleh diuruskan dengan cara berikut: 1. Buat Goroutine: Gunakan kata kunci "go". 2. Tunggu Goroutine untuk keluar: gunakan WaitGroup. 3. Batalkan Goroutine: gunakan konteks.Konteks dan konteks.DenganBatal. Dari segi penjadualan, Go menggunakan algoritma penjadualan preemptive, tetapi fungsi runtime.Gosched() boleh digunakan untuk mencetuskan penjadualan koperasi.

Pengurusan dan penjadualan goroutine dalam pengaturcaraan serentak Go

Pengurusan dan penjadualan Goroutine dalam pengaturcaraan serentak Go

Goroutine ialah unit pelaksanaan serentak ringan dalam bahasa Go, yang serupa dengan coroutine. Untuk mengurus dan menjadualkan gorout dengan berkesan, dengan itu meningkatkan prestasi dan kestabilan program serentak, bahasa Go menyediakan API yang kaya.

Pengurusan kitaran hayat Goroutine

  • Buat goroutine: Gunakan kata kunci go untuk mencipta goroutine, seperti yang ditunjukkan di bawah: go 关键字创建 goroutine,如下所示:

    go func() {
    // Goroutine 代码
    }
  • 等待 goroutine 退出:使用 WaitGroup 类型等待所有 goroutine 退出,如下所示:

    var wg sync.WaitGroup
    wg.Add(numOfWorkers)
    
    for i := 0; i < numOfWorkers; i++ {
    go func(i int) {
      // Goroutine 代码
      wg.Done()
    }(i)
    }
    
    wg.Wait()
  • 取消 goroutine:使用 context.Contextcontext.WithCancel 函数取消 goroutine 的执行,如下所示:

    ctx, cancel := context.WithCancel(context.Background())
    
    go func() {
    // Goroutine 代码
    select {
    case <-ctx.Done():
      return
    }
    }
    
    // 取消 goroutine
    cancel()

Goroutine 调度

Go 语言中内置的调度器负责管理和调度 goroutine。它通过以下算法来决定何时启动 goroutine:

  • 抢占式调度:调度器可以打断正在运行的 goroutine,切换到另一个 goroutine 执行。
  • 协作式调度:goroutine 主动让出控制权,交给调度器调度其他 goroutine。

默认情况下,Go 语言使用抢占式调度算法,但对于某些场景,协作式调度更加合适。可以使用 runtime.Gosched()

package main

import "fmt"
import "sync"

func main() {
  // 创建 goroutine 池
  pool := make(chan func())

  // 启动 goroutine 池中的 worker
  for i := 0; i < 10; i++ {
    go func() {
      for {
        // 从池中获取任务
        task := <-pool

        // 执行任务
        task()
      }
    }()
  }

  // 发送任务到池中
  for i := 0; i < 100; i++ {
    pool <- func() {
      fmt.Println("Task", i)
    }
  }

  // 等待任务完成
  var wg sync.WaitGroup
  wg.Add(100)
  for i := 0; i < 100; i++ {
    go func() {
      defer wg.Done()
      <-pool
    }()
  }
  wg.Wait()

  // 关闭池
  close(pool)
}

Tunggu untuk keluar:Segoroutine WaitGroup menunggu semua goroutine untuk keluar, seperti yang ditunjukkan di bawah:

rrreee

🎜🎜Batalkan goroutine: 🎜Gunakan context.Context dan context.WithCancel Fungsi membatalkan pelaksanaan goroutine, seperti yang ditunjukkan di bawah: 🎜rrreee🎜Goroutine Scheduling🎜🎜Penjadual yang terbina dalam bahasa Go bertanggungjawab untuk mengurus dan menjadualkan goroutine. Ia menggunakan algoritma berikut untuk menentukan masa untuk memulakan goroutine: 🎜🎜🎜🎜Penjadualan preemptive: 🎜Penjadual boleh mengganggu goroutine yang sedang berjalan dan bertukar kepada goroutine lain untuk pelaksanaan. 🎜🎜Penjadualan kolaboratif: 🎜goroutine secara aktif melepaskan kawalan dan menyerahkannya kepada penjadual untuk menjadualkan goroutine lain. 🎜Secara lalai, bahasa Go menggunakan algoritma penjadualan preemptive, tetapi untuk sesetengah senario, penjadualan kolaboratif adalah lebih sesuai. Penjadualan koperasi boleh dicetuskan menggunakan fungsi runtime.Gosched(). 🎜🎜Kes praktikal🎜🎜Berikut ialah contoh penggunaan goroutine untuk memproses tugas secara serentak: 🎜rrreee

Atas ialah kandungan terperinci Pengurusan dan penjadualan goroutine dalam pengaturcaraan serentak Go. 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