将一个通道的值循环到另一个通道
Loop values for one go channel to other
任何人都可以检查我的代码并检查我为什么会遇到死锁吗?
package main
import (
"fmt"
"sync"
)
func main() {
myCh := make(chan int, 10)
wg := &sync.WaitGroup{}
wg.Add(10)
// READ ONLY
go func(ch <-chan int, wg *sync.WaitGroup) {
value := <-myCh
fmt.Println(value)
wg.Done()
}(myCh, wg)
// send ONLY
go func(ch chan<- int, wg *sync.WaitGroup) {
for i := 0; i < 10; i++ {
myCh <- i
}
wg.Done()
}(myCh, wg)
wg.Wait()
}
我想从 SEND CHANNEL 发送循环值,而 OTHER CHANNEL 应该只接收每次迭代的值。
您在 wg.Add(10)
中添加了 delta = 10,并且只调用了两次 wg.Done()。
您应该调用 wg.Add(2)
或调用 wg.Done()
十次。
现在主函数锁定在 wg.Wait()
并等待另外八个 wg.Done()
调用。
您的 reader go 例程在第一个收到数据后退出。您必须在其中包含一个 for 循环才能连续读取该频道。
其次,您不需要在外循环中调用 wg.Sync(),因为它也会减少等待组。
package main
import (
"fmt"
"sync"
)
func main() {
myCh := make(chan int, 10)
wg := &sync.WaitGroup{}
wg.Add(10)
// READ ONLY
go func(ch <-chan int, wg *sync.WaitGroup) {
for value := range myCh { // this loop will read the channel continously
fmt.Println(value)
wg.Done()
}
}(myCh, wg)
// send ONLY
go func(ch chan<- int, wg *sync.WaitGroup) {
for i := 0; i < 10; i++ {
myCh <- i
}
// wg.Done() <- This not needed here
}(myCh, wg)
wg.Wait()
fmt.Println("DONE")
}
任何人都可以检查我的代码并检查我为什么会遇到死锁吗?
package main
import (
"fmt"
"sync"
)
func main() {
myCh := make(chan int, 10)
wg := &sync.WaitGroup{}
wg.Add(10)
// READ ONLY
go func(ch <-chan int, wg *sync.WaitGroup) {
value := <-myCh
fmt.Println(value)
wg.Done()
}(myCh, wg)
// send ONLY
go func(ch chan<- int, wg *sync.WaitGroup) {
for i := 0; i < 10; i++ {
myCh <- i
}
wg.Done()
}(myCh, wg)
wg.Wait()
}
我想从 SEND CHANNEL 发送循环值,而 OTHER CHANNEL 应该只接收每次迭代的值。
您在 wg.Add(10)
中添加了 delta = 10,并且只调用了两次 wg.Done()。
您应该调用 wg.Add(2)
或调用 wg.Done()
十次。
现在主函数锁定在 wg.Wait()
并等待另外八个 wg.Done()
调用。
您的 reader go 例程在第一个收到数据后退出。您必须在其中包含一个 for 循环才能连续读取该频道。
其次,您不需要在外循环中调用 wg.Sync(),因为它也会减少等待组。
package main
import (
"fmt"
"sync"
)
func main() {
myCh := make(chan int, 10)
wg := &sync.WaitGroup{}
wg.Add(10)
// READ ONLY
go func(ch <-chan int, wg *sync.WaitGroup) {
for value := range myCh { // this loop will read the channel continously
fmt.Println(value)
wg.Done()
}
}(myCh, wg)
// send ONLY
go func(ch chan<- int, wg *sync.WaitGroup) {
for i := 0; i < 10; i++ {
myCh <- i
}
// wg.Done() <- This not needed here
}(myCh, wg)
wg.Wait()
fmt.Println("DONE")
}