[Golang]两个goroutine之间的通信

huangapple go评论85阅读模式
英文:

[Golang]communication between 2 goroutine

问题

为什么在这个脚本中,goroutine "shower" 不起作用?

package main

import "fmt"

func main() {
    ch := make(chan int)
    go producer(ch)
    go shower(ch)
    for i := 0; i < 10; i++ {
        fmt.Printf("main: %d\n", i)
    }
}

func shower(c chan int) {
    for {
        j := <-c
        fmt.Printf("worker: %d\n", j)
    }
}

func producer(c chan int) {
    for i := 0; i < 10; i++ {
        c <- i
    }
}

在这个脚本中,shower 函数是一个无限循环,它从通道 c 中接收数据并打印出来。然而,在主函数中,我们没有等待 shower 函数完成,而是直接退出了程序。因此,shower 函数没有足够的时间来执行。要解决这个问题,你可以在主函数的末尾添加一个延迟,以等待 shower 函数完成执行。例如,可以使用 time.Sleep 函数来添加一个延迟:

package main

import (
    "fmt"
    "time"
)

func main() {
    ch := make(chan int)
    go producer(ch)
    go shower(ch)
    for i := 0; i < 10; i++ {
        fmt.Printf("main: %d\n", i)
    }
    time.Sleep(time.Second) // 添加延迟
}

func shower(c chan int) {
    for {
        j := <-c
        fmt.Printf("worker: %d\n", j)
    }
}

func producer(c chan int) {
    for i := 0; i < 10; i++ {
        c <- i
    }
}

这样,主函数会等待一秒钟,给足够的时间让 shower 函数执行完毕。

英文:

why in that script http://play.golang.org/p/Q5VMfVB67-
goroutine shower doesn't work ?

package main

import &quot;fmt&quot;

func main() {
	ch := make(chan int)
	go producer(ch)
	go shower(ch)
	for i := 0; i &lt; 10; i++ {
		fmt.Printf(&quot;main: %d\n&quot;, i)
	}
}
func shower(c chan int) {
	for {
		j := &lt;-c
		fmt.Printf(&quot;worker: %d\n&quot;, j)
	}
}
func producer(c chan int) {
	for i := 0; i &lt; 10; i++ {
		c &lt;- i
	}
}

答案1

得分: 4

你的主函数在goroutine有机会完成它们自己的工作之前就提前退出了。

在结束main()(停止整个程序)之前,你需要等待它们完成,可以使用sync.WaitGroup,就像在“等待n个goroutine终止”中所示。

在你的情况下,你需要等待goroutine shower() 结束:传递一个 wg *sync.WaitGroup 实例给 shower(),当它完成处理时,shower() 会通过 wg.Done() 发出信号。

英文:

Your main function exit way before the goroutines have a chance to complete their own work.

You need to wait for them to finish before ending main() (which stops the all program), with for instance sync.WaitGroup, as seen in "Wait for the termination of n goroutines".

In your case, you need to wait for goroutine shower() to end: pass a wg *sync.WaitGroup instance, for shower() to signal wg.Done() when it finishes processing.

huangapple
  • 本文由 发表于 2014年9月20日 16:00:06
  • 转载请务必保留本文链接:https://go.coder-hub.com/25946603.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定