1 回答
TA贡献1818条经验 获得超8个赞
有几种方法可以做到这一点,但我想说你的基本问题是你的接收器不进行聚合,如果你改变了它,它就不会是线程安全的。
修改接收器以进行聚合的简单选择是Image在循环之前分配一个数组并将指向它的指针传递给接收器方法,然后在读取通道时只使用 append。但是你会有一堆不同的 goroutines 争夺对同一个数组的访问。所以真的,你不希望聚合是多线程的。如果是,您需要锁定机制才能写入集合。
相反,您想在循环之后阻塞。最简单的方法就是在循环之后将接收器的主体放在那里内联;
imgs := []image.Image{}
img := <-imgChan
imgs = append(imgs, img)
spew.Dump(img.Bounds())
问题是在现实世界中,然后您的软件会在该线路上阻塞并且没有响应(无法死亡或退出或任何事情),因此您通常会使用频道选择,其中至少有 2 个频道/案例,一个中止该信道的呼叫方Partition是否需要退出并从接收的情况下可以使用将其杀死imgChan。那看起来更像这样;
imgs := []image.Image{}
select {
case img := <-imgChan
imgs = append(imgs, img)
spew.Dump(img.Bounds())
case _ := <-abortChan:
return MyCustomError();
}
这使得你的聚合不是并发的,只有产生我个人认为是更好设计的结果的工作。我也可以解释如何锁定你的接收器方法,但我相信你可以找到很多互斥体等的例子。
- 1 回答
- 0 关注
- 164 浏览
添加回答
举报