草庐IT

select-case

全部标签

select - 在 channel 上进行非阻塞多次接收

似乎到处都在讨论从channel读取应该始终是阻塞操作。态度似乎是这就是Go方式。这有一定的道理,但我正在尝试弄清楚如何从channel聚合内容。比如发送http请求。假设我有一个生成数据流的管道设置,所以我有一个生成队列/点流的channel。然后我可以让一个goroutine监听这个channel并发送一个HTTP请求以将它存储在一个服务中。这可行,但我正在为每个点创建一个http请求。我发送的端点也允许我批量发送多个数据点。我想做的是读取尽可能多的值,直到我阻塞channel。合并它们/发送单个http请求。然后阻塞channel直到我可以阅读再来一次。这就是我在C语言中使用线程

go - 使用运行的 goroutines 返回 for-select 循环时会发生什么

我正在尝试弄清楚如何在多个goroutine上等待结果时尽可能缩短运行时间。这个想法是在从channel(结果channel)检索消息时执行for-select循环,并在结果为假时跳出循环。随后,可能有一个或多个goroutine仍在运行,我不太清楚后台会发生什么。考虑一下:results:=make(chanbool,intNumRequests)goDoSomething(results)//DoSomethingsendstheresultonresultschannelgoDoSomething(results)//DoSomethingsendstheresultonresu

go - 使用运行的 goroutines 返回 for-select 循环时会发生什么

我正在尝试弄清楚如何在多个goroutine上等待结果时尽可能缩短运行时间。这个想法是在从channel(结果channel)检索消息时执行for-select循环,并在结果为假时跳出循环。随后,可能有一个或多个goroutine仍在运行,我不太清楚后台会发生什么。考虑一下:results:=make(chanbool,intNumRequests)goDoSomething(results)//DoSomethingsendstheresultonresultschannelgoDoSomething(results)//DoSomethingsendstheresultonresu

go - 为什么 golang 中的 select 只适用于 goroutine 中的 channel ?

考虑以下goplaygroundpackagemainimport"fmt"funcmain(){messages:=make(chanstring)messages上面的代码会报错fatalerror:allgoroutinesareasleep-deadlock!但是如果我把它改成packagemainimport"fmt"funcmain(){messages:=make(chanstring)gofunc(){messages它会起作用。这种行为是否有特殊原因?代码不应该在第一种情况下以顺序方式执行,以便在到达select语句时,消息将被传递并且它会捕获案例msg:=?

go - 为什么 golang 中的 select 只适用于 goroutine 中的 channel ?

考虑以下goplaygroundpackagemainimport"fmt"funcmain(){messages:=make(chanstring)messages上面的代码会报错fatalerror:allgoroutinesareasleep-deadlock!但是如果我把它改成packagemainimport"fmt"funcmain(){messages:=make(chanstring)gofunc(){messages它会起作用。这种行为是否有特殊原因?代码不应该在第一种情况下以顺序方式执行,以便在到达select语句时,消息将被传递并且它会捕获案例msg:=?

go - 推迟 : usage in case of long running functions?

下面是一个示例函数,它从连接池中获取到数据库的连接并执行查询并处理返回的结果。funcdbQuery()error{con:=db.getConn()result,err:=con.Query()iferr!=nil{returnerr}defercon.close()//orcon.close()//Processingtheresulttakesalongtimereturnnil}这种情况下处理结果时间比较长,并且没有为连接调用close,也就是说没有返回到连接池中。是不是直接调用con.close()这种情况当我们知道资源即使在不需要时也被保留了很长时间,就像这样吗?

go - 推迟 : usage in case of long running functions?

下面是一个示例函数,它从连接池中获取到数据库的连接并执行查询并处理返回的结果。funcdbQuery()error{con:=db.getConn()result,err:=con.Query()iferr!=nil{returnerr}defercon.close()//orcon.close()//Processingtheresulttakesalongtimereturnnil}这种情况下处理结果时间比较长,并且没有为连接调用close,也就是说没有返回到连接池中。是不是直接调用con.close()这种情况当我们知道资源即使在不需要时也被保留了很长时间,就像这样吗?

go - 在 Go select 构造中,我可以在两个 case 语句中发送和接收到无缓冲 channel 吗?

我希望这段代码进入无限循环,发送和接收消息。但它似乎既不发送也不接收。为什么?gofunc(){for{select{casech1 最佳答案 channeldocumentationsays:Ifthecapacityiszeroorabsent,thechannelisunbufferedandcommunicationsucceedsonlywhenbothasenderandreceiverareready.selectdocumentationsays:Ifoneormoreofthecommunicationscanpr

go - 在 Go select 构造中,我可以在两个 case 语句中发送和接收到无缓冲 channel 吗?

我希望这段代码进入无限循环,发送和接收消息。但它似乎既不发送也不接收。为什么?gofunc(){for{select{casech1 最佳答案 channeldocumentationsays:Ifthecapacityiszeroorabsent,thechannelisunbufferedandcommunicationsucceedsonlywhenbothasenderandreceiverareready.selectdocumentationsays:Ifoneormoreofthecommunicationscanpr

python - 从示例代码中理解goless.select

我发现了Goroutines的python实现,https://goless.readthedocs.org/en/latest/和玩耍给出文档中的以下代码:c1=goless.chan()c2=goless.chan()deffunc1():time.sleep(1)c1.send('one')goless.go(func1)deffunc2():time.sleep(2)c2.send('two')goless.go(func2)foriinrange(2):case,val=goless.select([goless.rcase(c1),goless.rcase(c2)])pri