Go penjadualan coroutine mempunyai tiga strategi: G0 dan G1: penjadualan awalan, keutamaan G1 > G0 dan G1: penjadualan awalan, keutamaan G1 > Penjadualan bukan preemptive: Coroutine berjalan sehingga ia secara aktif melepaskan hak pelaksanaan CPU.
Coroutine ialah mekanisme konkurensi ringan dalam Go. Dasar penjadualan menentukan cara pelaksanaan coroutine dijadualkan. Go menyediakan tiga strategi penjadualan:
G0 dan G1 kedua-duanya adalah penjadualan preemptif. Ini bermakna coroutine yang sedang berjalan boleh didahulukan oleh coroutine keutamaan yang lebih tinggi.
G1 mempunyai keutamaan yang lebih tinggi daripada G0. Jika kedua-dua coroutine berada dalam keadaan runnable, coroutine G1 akan dilaksanakan terlebih dahulu.
Penjadualan bukan preemptif ialah bukan preemptif. Ini bermakna bahawa menjalankan coroutine tidak boleh didahulukan. Ia akan terus berjalan sehingga pelaksanaan CPU dihasilkan secara sukarela.
package main import ( "fmt" "runtime" "sync" ) func main() { var wg sync.WaitGroup defer wg.Wait() for i := 0; i < 2; i++ { wg.Add(1) go func(i int) { defer wg.Done() fmt.Printf("协程 %d 在 G0 调度器上执行\n", i) runtime.Gosched() }(i) } }
package main import ( "fmt" "runtime" "sync" ) func main() { runtime.LockOSThread() for i := 0; i < 2; i++ { go func(i int) { fmt.Printf("协程 %d 使用非抢占式调度\n", i) }(i) } }
Atas ialah kandungan terperinci Strategi penjadualan coroutine Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!