Golang协程的调度策略

2024年 4月 15日 58.5k 0

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

以上就是Golang协程的调度策略的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论