卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章46994本站已运行31110

Golang协程的调度策略

go 协程调度有三种策略:g0 和 g1:抢占式调度,优先级 g1 > g0。g0 和 g1:抢占式调度,优先级 g1 > g0。非抢占式调度:协程运行至主动让出 cpu 执行权。

Golang协程的调度策略

Golang 协程的调度策略

协程是 Go 中轻量级的并发机制。调度策略决定了如何调度协程执行。Go 提供了三种调度策略:

  • G0
  • G1
  • 非抢占式调度

G0 和 G1

G0 和 G1 都是抢占式调度。这意味着正在运行的协程可以被更高优先级的协程抢占。

G1 的优先级高于 G0。如果两个协程都在可运行状态,则 G1 协程将先执行。

非抢占式调度

非抢占式调度是非抢占式的。这意味着正在运行的协程不能被抢占。它将继续运行,直到主动让出 CPU 执行权。

实战案例

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

使用非抢占式调度

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)
    }
}
卓越飞翔博客
上一篇: 如何返回 PHP 自定义函数的值?
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏