Go语言 在发生某些情况之前不要写入通道

fnvucqvd  于 2022-12-07  发布在  Go
关注(0)|答案(1)|浏览(114)

我目前有这样的东西

type Foo struct {
    rpChan        chan<- *Data
}

func (s *Foo) Work() {
    ......
    for event := range watch.ResultChan() {
        s.rpChan <- &sr
        ...........
        ...........
    }
}

然后在其他地方从该通道(rpChan)提取数据,如下所示

func (r *Bar) process() {
    for t := range r.reqChan {
          //How do I Pause writing more stuff to this channel ? It has just been unblocked
          r.processEvent(t)
          //Un-Pause writing more stuff to this channel - Now send me the next thing.  
    }
}

我的问题是,告诉通道在ProcessEvent完成之前停止向其写入更多内容的最佳方式是什么?由于process方法刚刚从r.reqChan中提取了一些内容,我不想要Foo Work()将更多数据写入rpChan通道,直到processEvent完成。我唯一的想法是引入另一个通道,当r.processEvent(t)完成时设置该通道,然后process将从该通道读取以继续。有没有更好的方法?也许是IPC队列?

yh2wf1be

yh2wf1be1#

该规范指出 * 如果容量为零或不存在,则通道未缓冲,并且仅当发送方和接收方都准备就绪时通信才成功。*
r.reqChan成为一个无缓冲通道,以确保当接收方goroutine执行r.processEvent(t)时,发送到r.reqChan的消息不会完成。
一个goroutine一次只能做一件事,如果接收方goroutine执行的是r.processEvent(t),那么接收方goroutine并没有执行range中隐含的receive操作,因此当接收方goroutine执行r.processEvent(t)时,发送操作并没有完成。

相关问题