我有多个goroutines尝试同时在同一个频道上接收.似乎在频道上开始接收的最后一个goroutine获得了价值.这是语言规范中的某个地方还是未定义的行为?
c := make(chan string)
for i := 0; i < 5; i++ {
go func(i int) {
<-c
c <- fmt.Sprintf("goroutine %d", i)
}(i)
}
c <- "hi"
fmt.Println(<-c)
Run Code Online (Sandbox Code Playgroud)
输出:
goroutine 4
Run Code Online (Sandbox Code Playgroud)
编辑:
我才意识到这比我想象的要复杂得多.消息在所有goroutine周围传递.
c := make(chan string)
for i := 0; i < 5; i++ {
go func(i int) {
msg := <-c
c <- fmt.Sprintf("%s, hi from %d", msg, i)
}(i)
}
c <- "original"
fmt.Println(<-c)
Run Code Online (Sandbox Code Playgroud)
输出:
original, hi from 0, hi from 1, hi from …Run Code Online (Sandbox Code Playgroud) 如果话题有问题,我很抱歉去,所以我很抱歉,但我希望你理解我的问题.我想通过频道将事件处理到不同的例行程序.这是一些示例代码
type Event struct {
Host string
Command string
Output string
}
var (
incoming = make(chan Event)
)
func processEmail(ticker* time.Ticker) {
for {
select {
case t := <-ticker.C:
fmt.Println("Email Tick at", t)
case e := <-incoming:
fmt.Println("EMAIL GOT AN EVENT!")
fmt.Println(e)
}
}
}
func processPagerDuty(ticker* time.Ticker) {
for {
select {
case t := <-ticker.C:
fmt.Println("Pagerduty Tick at", t)
case e := <-incoming:
fmt.Println("PAGERDUTY GOT AN EVENT!")
fmt.Println(e)
}
}
}
func main() {
err := …Run Code Online (Sandbox Code Playgroud) 无缓冲通道阻塞接收器,直到通道上的数据可用.我不清楚这种阻塞如何在同一通道上使用多个接收器(比如使用goroutines时).只要没有在该频道上发送数据,我相信他们都会阻止.
但是,一旦我向该频道发送单个值,会发生什么?哪个接收器/ goroutine将获取数据并因此解除阻塞?他们都是?排在第一位?随机?
我有几个 goroutine 写入同一个通道。如果我使用缓冲通道,我可以检索输入。但是,如果使用无缓冲通道,我只能读取大约一半的值:
func testAsyncFunc2() {
ch := make(chan int,10)
fmt.Println("testAsyncFunc2")
wg.Add(10)
for i :=0; i < 10; i++ {
go sender3(ch, i)
wg.Done()
}
receiver3(ch)
close(ch)
wg.Wait()
}
Run Code Online (Sandbox Code Playgroud)
这是接收器函数:
func receiver3(ch chan int) {
for {
select {
case <-ch:
fmt.Println(<-ch)
default:
fmt.Println("Done...")
return
}
}
}
Run Code Online (Sandbox Code Playgroud)
发送功能:
func sender3(ch chan int, i int) {
ch <- i
}
Run Code Online (Sandbox Code Playgroud)
和输出:
testAsyncFunc 2 0 4 6 8 2 完成...
虽然我希望能拿回 10 个号码。