为了账号安全,请及时绑定邮箱和手机立即绑定

Go 在睡眠时超时,但在忙等待时不会超时

Go 在睡眠时超时,但在忙等待时不会超时

Go
胡子哥哥 2021-07-29 13:01:19
在 Go 中,我可以使用time.After超时睡眠函数,但我不能对忙等待(或工作)的函数执行相同的操作。以下代码timed out一秒后返回,然后挂起。package mainimport (        "fmt"        "time")func main() {        sleepChan := make(chan int)        go sleep(sleepChan)        select {        case sleepResult := <-sleepChan:                fmt.Println(sleepResult)        case <-time.After(time.Second):                fmt.Println("timed out")        }        busyChan := make(chan int)        go busyWait(busyChan)        select {        case busyResult := <-busyChan:                fmt.Println(busyResult)        case <-time.After(time.Second):                fmt.Println("timed out")        }}func sleep(c chan<- int) {        time.Sleep(10 * time.Second)        c <- 0}func busyWait(c chan<- int) {        for {        }        c <- 0}为什么在第二种情况下超时不触发,我需要使用什么替代方法来中断工作的 goroutines?
查看完整描述

1 回答

?
HUH函数

TA贡献1836条经验 获得超4个赞

该for {}语句是一个无限循环,它独占一个处理器。设置runtime.GOMAXPROCS为 2 或更多以允许计时器运行。


例如,


package main


import (

    "fmt"

    "runtime"

    "time"

)


func main() {

    fmt.Println(runtime.GOMAXPROCS(0))

    runtime.GOMAXPROCS(runtime.NumCPU())

    fmt.Println(runtime.GOMAXPROCS(0))

    sleepChan := make(chan int)

    go sleep(sleepChan)

    select {

    case sleepResult := <-sleepChan:

        fmt.Println(sleepResult)

    case <-time.After(time.Second):

        fmt.Println("timed out")

    }


    busyChan := make(chan int)

    go busyWait(busyChan)

    select {

    case busyResult := <-busyChan:

        fmt.Println(busyResult)

    case <-time.After(time.Second):

        fmt.Println("timed out")

    }

}


func sleep(c chan<- int) {

    time.Sleep(10 * time.Second)

    c <- 0

}


func busyWait(c chan<- int) {

    for {

    }

    c <- 0

}

输出(4 CPU 处理器):


1

4

timed out

timed out


查看完整回答
反对 回复 2021-08-02
  • 1 回答
  • 0 关注
  • 182 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信