目前在爬取一个网站但是加协程的时候管道老是阻塞;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{//下载图片}
慕斯王
TA贡献1864条经验 获得超2个赞
简单版本的:packagemaintypeDetailDatastringtypeImageDatastringvar(detailCacheSize=100imageCacheSize=200detailCh=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.//senddetailtochannelfor_,detail:=rangedetails{detailCh<-detail}close(detailCh)}funcFetchDetail(){deferwg.Done()varimages[]ImageDatafordetail:=rangedetailCh{//getimagesforimage:=rangeimages{imageCh<-image}}close(imageCh)}funcFetchImage(uristring){deferwg.Done()forimage:=rangeimageCh{//downloadimage}}如果量非常大,还可以启动多个GetDetail和GetDetailImg的协程,然后动态监测数据是否执行完成,然后做closechannel操作。
添加回答
举报
0/150
提交
取消