初级会员
  • 第 6142 位会员
  • foreveriuu
  • delphicoder@163.com
  • 2016-09-06 10:02:24
  • Offline
  • 0

最近发布的文章

    暂无

最近分享的资源

    暂无

最近发布的项目

    暂无

最近的评论

  • @stevewang 非常感谢,确实达到了我想要的效果。初学Go,能遇到热心人是我的幸运,再次感谢。
  • @stevewang 预测后续3个,是为了利用并发。如果1下载成功后只下载2,那就成单线程了。所以,我就多预测几个,这样2,3,4就能同时下载。
  • @stevewang @l603430 我的想法是,每下载成功一个文件,就预测后续的3个文件可能存在,尝试下载。 过程符合要求,就是最后会报deadlock,不知道如何避免这个。
  • 我仿照书上的写个一个,有个问题,程序结束后会报fatal error: all goroutines are asleep - deadlock! ` package main import ( "fmt" "time" ) // URLInfo 保留构造下载链接的信息 type URLInfo struct { urltype string page int } func download1(info URLInfo) bool { time.Sleep(time.Second) if info.page < 10 { fmt.Printf("%s%03d.dat downloaded \n", info.urltype, info.page) } else { fmt.Printf("%s%03d.dat download fail \n", info.urltype, info.page) } return (info.page < 10) } func main() { urllist := make(chan []URLInfo) // 预测可能的文件列表,允许重复 undownLinks := make(chan URLInfo) // 待下载文件URLs,不重复 // 初始化下载. go func() { urllist <- []URLInfo{{"AAA", 1}, {"BBB", 1}, {"CCC", 1}} }() // 分配3个goroutines来下载文件 for i := 0; i < 3; i++ { go func() { for ui := range undownLinks { if download1(ui) { urls := []URLInfo{{ui.urltype, ui.page + 1}, {ui.urltype, ui.page + 2}, {ui.urltype, ui.page + 3}} go func() { urllist <- urls }() } } }() } // 通过主goroutine来过滤重复的文件列表,将未下载的文件发送至undownLinks downedLinks := make(map[URLInfo]bool) for list := range urllist { for _, link := range list { if !downedLinks[link] { downedLinks[link] = true undownLinks <- link } } } close(urllist) close(undownLinks) } `
  • 多谢解答。但是下载数量未知如何解决呢?比如AAA是到了AAA247.dat,但是预先不知道数量,只有尝试AAA247.dat下载失败才知道需要结束,其它BBB、CCC也是如此。