我目前有这样的东西
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队列?
1条答案
按热度按时间yh2wf1be1#
该规范指出 * 如果容量为零或不存在,则通道未缓冲,并且仅当发送方和接收方都准备就绪时通信才成功。*
让
r.reqChan
成为一个无缓冲通道,以确保当接收方goroutine执行r.processEvent(t)
时,发送到r.reqChan
的消息不会完成。一个goroutine一次只能做一件事,如果接收方goroutine执行的是
r.processEvent(t)
,那么接收方goroutine并没有执行range
中隐含的receive操作,因此当接收方goroutine执行r.processEvent(t)
时,发送操作并没有完成。