相关疑难解决方法(0)

Go select语句的优先级解决方法

我希望在两个通道上进行常规监听,当两个通道都耗尽时阻塞.但是,如果两个通道都包含数据,我希望在处理另一个通道之前将其耗尽.

在下面的工作示例中,我希望outexit处理之前将所有内容都耗尽.我使用select没有任何优先顺序的-statement.我如何解决问题,在退出之前处理所有10个输出值?

package main

import "fmt"

func sender(out chan int, exit chan bool){
    for i := 1; i <= 10; i++ {
        out <- i
    } 
    exit <- true
}

func main(){
    out := make(chan int, 10)
    exit := make(chan bool)

    go sender(out, exit)

    L:
    for {
        select {
            case i := <-out:
                fmt.Printf("Value: %d\n", i)
            case <-exit:
                fmt.Println("Exiting")
                break L
        }
    }
    fmt.Println("Did we get all 10? Most likely not")
}
Run Code Online (Sandbox Code Playgroud)

concurrency select channel go

31
推荐指数
4
解决办法
1万
查看次数

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
查看次数

从频道阅读一段时间的惯用法

我需要从Go通道读取数据一段时间(比如说5秒).带超时的select语句对我来说不起作用,因为我需要读取尽可能多的值并在5秒后完全停止.到目前为止,我已经提出了一个使用额外时间通道的解决方案https://play.golang.org/p/yev9CcvzRIL

package main

import "time"
import "fmt"

func main() {
    // I have no control over dataChan
    dataChan := make(chan string)
    // this is a stub to demonstrate some data coming from dataChan
    go func() {
        for {
            dataChan <- "some data"
            time.Sleep(time.Second)
        }
    }()

    // the following is the code I'm asking about
    timeChan := time.NewTimer(time.Second * 5).C
    for {
        select {
        case d := <-dataChan:
            fmt.Println("Got:", d)
        case <-timeChan:
            fmt.Println("Time's up!")
            return
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道有没有更好或更有惯用的方法来解决这个问题?

concurrency timeout channel idiomatic go

6
推荐指数
1
解决办法
1952
查看次数

选择和 context.Context Done 通道

我不明白Done()通道如何context.Context按预期工作。模块文档(和使用它的源代码)依赖于这种模式:

select {
case <-ctx.Done():
    return ctx.Err()

case results <- result:
}
Run Code Online (Sandbox Code Playgroud)

Done()如果Context取消或超时,则关闭通道返回,并且Err()变量保存原因。

关于这种方法,我有两个问题:

  1. select通道关闭时的行为是什么?案件何时以及为何进入?没有分配的事实是否具有相关性?

  2. 根据语言参考:

    如果可以进行一个或多个通信,则通过统一伪随机选择选择可以进行的单个通信。

    如果选择是随机的,那么该模式如何保证在Context取消时我不会将结果发送到管道中?我会理解是否按申报顺序评估案例(并选择了封闭渠道案例)。

如果我在这里完全偏离轨道,请从更好的角度向我解释这一点。

concurrency channel go

3
推荐指数
1
解决办法
261
查看次数

标签 统计

channel ×4

go ×4

concurrency ×3

select ×2

goroutine ×1

idiomatic ×1

scheduling ×1

timeout ×1