【发布时间】:2022-01-02 11:32:48
【问题描述】:
我有两个 goroutine:主要的 worker 和一个 helper,它会为一些帮助而分拆。 helper 可能会遇到错误,因此我使用通道将错误从 helper 传递到 worker。
func helper(c chan <- error) (){
//do some work
c <- err // send errors/nil on c
}
helper() 的调用方式如下:
func worker() error {
//do some work
c := make(chan error, 1)
go helper(c)
err := <- c
return err
}
问题:
-
语句
err := <- c是否阻塞worker?我不这么认为,因为通道是缓冲的。 -
如果它是阻塞的,我如何使它成为非阻塞的?我的要求是让
worker及其调用者继续其余的工作,而不是等待值出现在频道上。
谢谢。
【问题讨论】:
-
如果您还没有准备好等待接收来自
c的信息,请不要这样做。你是把rest of the work放在<-c之后的那个人;只需交换订单 -
@DanielFarrell,
worker()是否会被阻止,直到通道上出现值c? -
@Someone 是的。 有些东西必须等待它(否则不要费心发送它)。
-
是的,一旦您从
c读取数据,您就会阻止c上的数据准备就绪。这就是你想要的:你想确保 both 协程与c“同步”,因为一旦你从c收到,你假设helper在功能上是完整的。这里的每个人都在说,首先启动helper,然后让worker完成它的工作,然后等待c这样你就知道了helper完成了它的工作,然后你就知道所有工作都完成了。 -
@DanielFarrell,是的,我明白了。但我的要求是
helper和worker都独立执行,如worker(及其调用者等)都应该继续工作,而不会阻塞helper。helper将在完成其工作时返回 error/nil。这有意义吗?