Rumah > Artikel > pembangunan bahagian belakang > Pengurusan dan penjadualan goroutine dalam pengaturcaraan serentak Go
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.
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.
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.Context
和 context.WithCancel
函数取消 goroutine 的执行,如下所示:
ctx, cancel := context.WithCancel(context.Background()) go func() { // Goroutine 代码 select { case <-ctx.Done(): return } } // 取消 goroutine cancel()
Go 语言中内置的调度器负责管理和调度 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: 🎜Gunakancontext.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: 🎜rrreeeAtas ialah kandungan terperinci Pengurusan dan penjadualan goroutine dalam pengaturcaraan serentak Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!