Rumah >pembangunan bahagian belakang >Golang >Strategi penjadualan coroutine Golang

Strategi penjadualan coroutine Golang

WBOY
WBOYasal
2024-04-15 18:12:021245semak imbas

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.

Strategi penjadualan coroutine Golang

Strategi penjadualan coroutine Golang

Coroutine ialah mekanisme konkurensi ringan dalam Go. Dasar penjadualan menentukan cara pelaksanaan coroutine dijadualkan. Go menyediakan tiga strategi penjadualan:

  • G0
  • G1
  • Penjadualan bukan preemptif

G0 dan G1

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

Penjadualan bukan preemptif ialah bukan preemptif. Ini bermakna bahawa menjalankan coroutine tidak boleh didahulukan. Ia akan terus berjalan sehingga pelaksanaan CPU dihasilkan secara sukarela.

Kes praktikal

Menggunakan G0

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)
    }
}

Menggunakan penjadualan bukan preemptif

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!

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