Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何等待接收器通道在golang中完成其执行?_Go_Goroutine - Fatal编程技术网

如何等待接收器通道在golang中完成其执行?

如何等待接收器通道在golang中完成其执行?,go,goroutine,Go,Goroutine,我有这个示例代码,我面临这个同步问题,谁能帮助我如何实现这一点 package main import "fmt" func main() { baseChan := make(chan int) go func(bCh chan int){ for { select{ case stats, _ := <- bCh: fmt.Println("base stats", stats) }} }(baseChan) second := make(chan int) g

我有这个示例代码,我面临这个同步问题,谁能帮助我如何实现这一点

package main

import "fmt"

func main() {

baseChan := make(chan int)
go func(bCh chan int){
for {
select{
    case stats, _ := <- bCh:
    fmt.Println("base stats", stats)
}}
}(baseChan)

second := make(chan int)
go func (sCh chan int) {
fmt.Println("second channel")
for {
select {
case stats, _ := <- sCh:
    fmt.Println("seconds stats", stats)
    baseChan <- stats
}
}
}(second)
runLoop(second)
}

func runLoop(second chan int) {
 for i := 0; i < 5; i++ {
fmt.Println("writing i", i)
    second <- i
}
}
我希望输出像这样

writing i 0
seconds stats 0
base stats 0

writing i 1
seconds stats 1
base stats 1

writing i 2
seconds stats 2
base stats 2

代码按预期工作。但您可以做的一件事是,在runLoop函数的两个连续步骤之间设置一定的间隔。但不建议设置固定的时间间隔,您需要编写一些代码以确保这些作业已完成。只是展示这个例子,向你展示这里发生了什么

func runLoopsecond chan int{ 对于i:=0;i<5;i++{ fmt.打印文字i,i
其次代码按预期工作。但有一件事你可以做,在runLoop函数的两个连续步骤之间设置一定的间隔。但是不建议设置固定的间隔,你需要编写一些代码来确保这些工作完成。只需显示这个示例,就可以向你展示这里发生的事情

func runLoopsecond chan int{ 对于i:=0;i<5;i++{ fmt.打印文字i,i 其次您可以编写goroutines,以便它们彼此等待。例如,这里有一个中级传输函数,它位于生产者和消费者之间,并迫使他们缓慢前进:

func MIDLIN,out chan int,INAK,outAck chan结构{}{ 推迟收尾 对于值:=中的范围{ fmt.Printlnmiddle得到,值 out您可以编写goroutines,以便它们彼此等待。例如,这里有一个中级传输函数,它位于生产者和消费者之间,并迫使他们缓慢前进:

func MIDLIN,out chan int,INAK,outAck chan结构{}{ 推迟收尾 对于值:=中的范围{ fmt.Printlnmiddle得到,值
如果您的代码中有fmt.Printlnsecond通道,那么它是如何发生的?您想要的输出根本没有它?您的代码中没有任何东西可以保证输出消息的顺序。因此,实际值当然是预期的。@zerkms抱歉,我没有得到您的消息。这就是我试图实现的,我如何控制输出消息的顺序执行时,通道A会写入B,通道B会写入C,直到相应的通道完成其执行。您的消费者不会与生产者同步,他们会独立执行其工作。如果您需要生产者等待消费者完成其处理,则您不需要通道和goroutine,只需写入blocki即可ng同步代码。通道B写入C会等到相应的通道完成其执行。-不要使用goroutines和通道,它自然会变成函数调用。如果代码中有fmt.Printlnsecond通道,它是如何发生的?您所需的输出根本没有它?代码中没有任何东西可以保证输出消息的顺序。因此,实际值当然是预期值。@泽克姆斯,很抱歉,我没有得到您的消息。这就是我试图实现的,我如何控制执行顺序,以便通道A写入B,通道B写入C,直到相应的通道完成其执行。您的消费者与生产者不同步,它们独立执行其工作。如果您需要生产者等待消费者完成其处理,则您不需要通道和goroutine,只需编写阻塞同步代码。通道B写入C,直到各自的通道完成其执行。-不要使用goroutine和通道,它将成为函数调用自然。设置一定数量的间隔这是解决并发问题最糟糕的方法。我已经尝试过了,但我不想使用time.Sleep。正如您在上文中建议的那样,删除多通道逻辑并将其仅与一个通道实现对齐。感谢设置一定数量的间隔这是解决并发问题最糟糕的方法。我我已经尝试过了,但我不想使用time.Sleep。正如您在上面建议的那样,删除多通道逻辑并将其与仅一个通道实现对齐。谢谢
writing i 0
seconds stats 0
base stats 0

writing i 1
seconds stats 1
base stats 1

writing i 2
seconds stats 2
base stats 2
writing i 0
seconds stats 0
base stats 0

writing i 1
seconds stats 1
base stats 1

writing i 2
seconds stats 2
base stats 2

writing i 3
seconds stats 3
base stats 3

writing i 4
seconds stats 4
base stats 4