相关疑难解决方法(0)

go select语句的强制优先级

我有以下代码:

func sendRegularHeartbeats(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            return
        case <-time.After(1 * time.Second):
            sendHeartbeat()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

此功能在专用的go-routine中执行,并每秒发送一次心跳消息.取消上下文时,整个过程应立即停止.

现在考虑以下场景:

ctx, cancel := context.WithCancel(context.Background())
cancel()
go sendRegularHeartbeats(ctx)
Run Code Online (Sandbox Code Playgroud)

这将启动具有封闭上下文的心跳例程.在这种情况下,我不希望传输任何心跳.因此,case应立即输入选择中的第一个块.

但是,似乎case无法保证评估块的顺序,并且代码有时会发送心跳消息,即使上下文已被取消.

实现这种行为的正确方法是什么?

我可以在第二个中添加"isContextclosed" - 检查case,但这看起来更像是一个丑陋的解决方法.

go

8
推荐指数
2
解决办法
1404
查看次数

golang:当涉及多个频道时,选择如何工作?

我在多个非缓冲通道上使用select时发现了

select {
case <- chana:
case <- chanb:
}
Run Code Online (Sandbox Code Playgroud)

即使两个通道都有数据,但在处理此选择时,如果chana和case chanb处于不平衡的调用.

package main

import (
    "fmt"
    _ "net/http/pprof"
    "sync"
    "time"
)

func main() {
    chana := make(chan int)
    chanb := make(chan int)

    go func() {
        for i := 0; i < 1000; i++ {
            chana <- 100 * i
        }
    }()

    go func() {
        for i := 0; i < 1000; i++ {
            chanb <- i
        }
    }()

    time.Sleep(time.Microsecond * 300)

    acount := 0
    bcount := 0
    wg := …
Run Code Online (Sandbox Code Playgroud)

select scheduling channel go goroutine

8
推荐指数
1
解决办法
6534
查看次数

Golang计时器,长度为0

我写了一个代码剪切,创建一个长度为0的计时器,它不会立即过期(这是我的预期).一个非常短的睡眠呼叫确实使它过期,但我很困惑为什么.

我关心的原因是使用这个想法的代码有一个片段,在低概率错误时返回0,并且认为应该将定时器设置为立即过期,并重试一个函数.我不相信这里所需的纳秒睡眠会影响我的实施,但它让我感到困扰.

我犯了错误,这是预期的行为吗?

谢谢!

 package main

    import (
        "fmt"
        "time"
    )

    func main() {
        testTimer := time.NewTimer(time.Duration(0) * time.Millisecond)
        fmt.Println(Expired(testTimer))
        time.Sleep(time.Nanosecond)
        fmt.Println(Expired(testTimer))
    }

    func Expired(T *time.Timer) bool {
        select {
        case <-T.C:
            return true
        default:
            return false
        }
    }
Run Code Online (Sandbox Code Playgroud)

游乐场链接:https://play.golang.org/p/xLLHoR8aKq

打印

false
true
Run Code Online (Sandbox Code Playgroud)

timer go

2
推荐指数
1
解决办法
1518
查看次数

标签 统计

go ×3

channel ×1

goroutine ×1

scheduling ×1

select ×1

timer ×1