为了账号安全,请及时绑定邮箱和手机立即绑定

大佬们遇到过这个问题吗?go协程管道的一个写法跪求!

大佬们遇到过这个问题吗?go协程管道的一个写法跪求!

守着星空守着你 2019-08-17 21:14:46
目前在爬取一个网站但是加协程的时候管道老是阻塞;funcmain(){GetHome()}//获取首页数据funcGetHome(){//homeResult是通过正则拿到全部的详情地址for_,vrangehomeResult{GetDetail(homeResult[1])}}//获取详情内容funcGetDetail(uristring){//这里通过正则获取到内容的图片地址for_,vrange()imgResult{GetDetailImg(imgResult[1])}}//获取详情中的图片funcGetDetailImg(uristring){//这里下载图片}以上代码如果加协程后居然会导致管道阻塞;在每个方法调用的时候加上go咋样加管道呢?请大神解答(PS:有红包哦);
查看完整描述

2 回答

?
慕斯709654

TA贡献1840条经验 获得超5个赞

一个简单的订阅-发布模型,先启动订阅,然后将获取到的内容发布到通道,订阅会自动执行下载。
var(
imgAddrCh=make(chanstring,1024)
)
funcmain(){
goGetDetailImg()
GetHome()
close(imgAddrCh)
}
//获取首页数据
funcGetHome(){
//homeResult是通过正则拿到全部的详情地址
for_,vrangehomeResult{
GetDetail(homeResult[1])
}
}
//获取详情内容
funcGetDetail(uristring){
//这里通过正则获取到内容的图片地址
for_,vrange()imgResult{
imgAddrCh<-v
}
}
//获取详情中的图片
funcGetDetailImg(){
foruri:=rangeimgAddrCh{
//下载图片
}
                            
查看完整回答
反对 回复 2019-08-17
?
慕斯王

TA贡献1864条经验 获得超2个赞

简单版本的:
packagemain
typeDetailDatastring
typeImageDatastring
var(
detailCacheSize=100
imageCacheSize=200
detailCh=make(chanDetailData,detailCacheSize)
imageCh=make(chanImageData,imageCacheSize)
wg=sync.WaitGroup{}
)
funcmain(){
wg.Add(2)
goFetchDetail()
goFetchImage()
GetHome(urlstring)
wg.Wait()
}
funcGetHome(urlstring){
vardetails[]DetailData
//getdetailsfromhomeurl.
//senddetailtochannel
for_,detail:=rangedetails{
detailCh<-detail
}
close(detailCh)
}
funcFetchDetail(){
deferwg.Done()
varimages[]ImageData
fordetail:=rangedetailCh{
//getimages
forimage:=rangeimages{
imageCh<-image
}
}
close(imageCh)
}
funcFetchImage(uristring){
deferwg.Done()
forimage:=rangeimageCh{
//downloadimage
}
}
如果量非常大,还可以启动多个GetDetail和GetDetailImg的协程,然后动态监测数据是否执行完成,然后做closechannel操作。
                            
查看完整回答
反对 回复 2019-08-17
  • 2 回答
  • 0 关注
  • 277 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信