我该如何等待对其他多个goroutines上的一个goroutine响应



嗨,嗨,我从python3传递去,所以我试图重写创建的lib ive以获得更好的性能。

由于Golang XD中的IM NOOB,IM使用有限的API下载数百个JSON,并且我想在可能的情况下使用尽可能少的请求。因此,在下载这些jsons时,使用的一些URL是重复的,我得到的第一个想法是通过MAP [StringLink]*MyJsonReceed在我的下载函数(Goroutines)和每个Goroutine之间,然后在下载检查之前,如果链接已经由另一个链接处理,则,因此,不再需要再次请求浪费带宽 API调用它应该等待另一个Goroutine完成下载并从字典中获取它。

我几乎没有选择:

1)goroutine必须检查链接是否在地图中,如果是,则检查词典中的指针是否仍然为零或包含JSON。(可能是最不好的方法,但有效)

2)更改在goroutines之间传递的映射到(Map [StringLink] Chan Myjson)可能是最有效的方法,但我不知道如何将单个消息发送到频道并通过多个等待Goroutines接收。p> 3)我可以通过对结构添加计数器来使用选项(2)下载的Goroutine完成它将将X消息发送到频道。但是,这种方式将使我在地图上添加太多锁,这是浪费性能。

注意:我需要在所有功能执行的末尾的地图,以将下载的JSON保存到我的数据库中,以免再次下载它们。

预先感谢大家的帮助。

我要解决的任务是为此使用goroutine池。会有一个生产商在通道上发送URL,并且工人goroutines将在此通道上进行范围,以接收到要处理的URL(获取)。一旦"完成" URL,同一工作者也可以将其保存到数据库中,或在" collector" goroutine上传递结果频道上的结果,如果这是必需的,可以顺序保存。

该设计的构造确保仅一个工人Goroutine接收到频道上发送的每个URL,因此您不需要任何其他同步(如果使用共享地图,则需要这些同步)。有关频道的更多信息,请参阅Golang通道的用途?

go在goroutines(频道)之间的通信比共享变量相比。引用有效的GO:通过交流分享:

不要通过共享内存来通信;而是通过通信共享内存。

示例您如何创建工作池,请参阅这是一个惯用的工作池吗?

最新更新