Skip to content

Instantly share code, notes, and snippets.

@Mistobaan
Created May 16, 2012 21:49
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Mistobaan/2714241 to your computer and use it in GitHub Desktop.
Save Mistobaan/2714241 to your computer and use it in GitHub Desktop.
Async Http Download
package main
import ("flag"
"net/http"
"net/url"
"io"
"log"
"io/ioutil"
"sync"
)
// Resource represents an HTTP URL to be polled by this program.
type Resource struct {
url string
errCount int
}
func (r * Resource) Download() {
_, err := url.Parse(r.url)
if err != nil {
log.Panic(err, "Invalid url", r.url)
}
resp, err := http.Get(r.url)
if err != nil {
log.Panic(err)
}
defer resp.Body.Close()
fd, err := ioutil.TempFile("/tmp", "download.tmp.")
if err != nil {
log.Panic(err)
}
defer fd.Close()
log.Print(r.url, " WRITING ", fd.Name())
defer log.Print(r.url, " DONE " )
io.Copy(fd, resp.Body)
}
func Poller(in <-chan *Resource, out chan <- *Resource, error chan <- *Resource, workers *sync.WaitGroup) {
defer func(){
err := recover()
log.Println("Error !", err)
}()
defer workers.Done()
for r := range in {
r.Download()
log.Println("Message about to be sent", r)
out <- r
log.Println("Message sent", r)
}
log.Println("No more input data")
}
func main(){
flag.Parse()
pending := make(chan *Resource)
completed := make(chan *Resource)
error := make(chan *Resource)
numPollers := 1
workers := &sync.WaitGroup{}
for i := 0; i < numPollers; i++ {
workers.Add(1)
go Poller(pending, completed, error, workers)
}
for _, url := range flag.Args() {
log.Print("Scheduling ", url)
pending <- &Resource{url: url}
}
close(pending)
log.Print("Here")
go func(){
defer log.Print("goroutine 1 terminated ")
workers.Wait()
close(completed)
close(error)
}()
log.Print("Here2 ")
go func() {
defer log.Print("goroutine 2 terminated ")
log.Print("Starting XXX")
for resource_complete := range completed {
log.Print("Complete: ", resource_complete)
}
for resource_complete := range error {
log.Print("Error: ", resource_complete)
}
}()
log.Print("Here3 ")
log.Print("Finish")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment