使用Go并发下载图片资源
2014-01-03 00:00
471 查看
摘要: 对爬虫已爬到的数据进行下载,响应时间与请求量成正比。还未做分量下载与日志记录。
对爬虫已爬到的数据进行下载,请求量与响应时间成正比。
还未做分量下载与日志记录。
package img import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" "io" "net/http" "os" "runtime" "strconv" "sync" "time" ) const ( DataRoot = "./tmp/" // 存放封面图的根目录 TimeoutLimit = 10 // 设置超时时间 ) // 表示章节ID和封面URL的对应关系 type VolumeCover struct { VolumeID int Url string Lock sync.Mutex Msg chan string Flag bool "timeout_flag" } // 将图片下载并保存到本地 func SaveImage(vc *VolumeCover) { res, err := http.Get(vc.Url) defer res.Body.Close() if err != nil { vc.Msg <- (strconv.Itoa(vc.VolumeID) + " HTTP_ERROR") } // 创建文件 dst, err := os.Create(DataRoot + strconv.Itoa(vc.VolumeID) + ".jpg") if err != nil { vc.Msg <- (strconv.Itoa(vc.VolumeID) + " OS_ERROR") } // 生成文件 io.Copy(dst, res.Body) // goroutine通信 vc.Lock.Lock() vc.Msg <- "in" vc.Flag = true vc.Lock.Unlock() } func Start(name string, password string, limit int) error { runtime.GOMAXPROCS(4) sl, err := sql.Open("mysql", name+":"+password+"@/xxx?charset=utf8") defer sl.Close() if err != nil { return err } // 构造SELECT语句并检索 queryStr := "SELECT VolumeID, ImageUrl FROM volume " if limit > 0 { queryStr += "limit " + strconv.Itoa(limit) } rows, err := sl.Query(queryStr) defer rows.Close() if err != nil { return err } // 构建列表 i := 0 vclist := make([]*VolumeCover, limit) for rows.Next() { vc := &VolumeCover{} if err := rows.Scan(&vc.VolumeID, &vc.Url); err != nil { return err } vc.Msg = make(chan string, 1) //vc.To = make(chan bool, 1) vc.Lock = *new(sync.Mutex) vclist[i] = vc i++ } // start goroutines for i := 0; i < len(vclist); i++ { go SaveImage(vclist[i]) go func(i int) { time.Sleep(TimeoutLimit * time.Second) if vclist[i].Flag == false { vclist[i].Msg <- "out" } }(i) } // 阻塞地获取结果 for i := 0; i < len(vclist); i++ { func(c *VolumeCover) { select { case m := <-c.Msg: fmt.Println(m) } }(vclist[i]) } return nil }
对爬虫已爬到的数据进行下载,请求量与响应时间成正比。
还未做分量下载与日志记录。
相关文章推荐
- 使用cocos2d-x 3.2下载图片资源小例子
- 使用cocos2d-x 3.2下载图片资源小例子
- Nodejs大批量下载图片入坑指南(使用async和bagpipe处理大并发量请求)
- Fresco 使用教程(包括显示在线图片,资源图片、下载、清除缓存)
- 多线程:使用ImageView下载图片(模仿 SDWebImage)
- ListView使用SimpleAdapter加载非drawable资源图片
- Android使用Drawable资源之使用ClipDrawable资源 实现图片缓慢展示
- 关于使用SharedObject来缓存游戏图片或者swf文件资源到客户端本地的研究
- (转)Unity3d使用心得(2):Unity3d 动态下载动画资源——AnimationClip 的使用
- 使用SDWebImage直接下载图片
- Xcode6 beta版使用问题:图片资源无法预览
- Android中使用assets下的资源——图片资源
- Nginx模块学习之————accesskey权限模块使用(Nginx防盗链详细解说),防止别人下载文件和图片
- 使用python进行爬虫下载指定网站的图片
- 使用ABAP批量下载Markdown源文件里的图片到本地
- Android Studio 插件下载资源,离线安装和使用
- android自定义进度条渐变色View,不使用任何图片资源
- Android 下载显示网络图片 实现直接使用类似setimage的方法来完成
- VC项目中使用图片资源
- OGEngine 手游引擎教程:图片资源加载及工具使用