Skip to content

Instantly share code, notes, and snippets.

@zhangsen
Created July 10, 2012 09:26
Show Gist options
  • Save zhangsen/3082270 to your computer and use it in GitHub Desktop.
Save zhangsen/3082270 to your computer and use it in GitHub Desktop.

Revisions

  1. zhangsen created this gist Jul 10, 2012.
    72 changes: 72 additions & 0 deletions gistfile1.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,72 @@
    import threading, sys
    import urlparse, httplib

    is_done = False

    class Downloader(threading.Thread):
    def __init__(self, url, buf, n, semin, semout):
    self.buf = buf
    self.bufn = n
    self.semin = semin
    self.semout = semout
    scheme, netloc, path, query, fragment = urlparse.urlsplit(url)
    self.host, self.path = netloc, path
    threading.Thread.__init__(self)

    def run(self):
    h = httplib.HTTPConnection(self.host)
    h.request("GET", self.path)
    r = h.getresponse()

    global is_done
    i = 0
    while True:
    self.semin.acquire()
    self.buf[i] = r.read(1024)
    ## when to stop???
    if not self.buf[i]:
    is_done = True
    break
    i = (i+1) % self.bufn
    self.semout.release()
    h.close()

    class Writer(threading.Thread):
    def __init__(self, dest, buf, n, semin, semout):
    self.dest = dest
    self.buf = buf
    self.bufn = n
    self.semin = semin
    self.semout = semout
    threading.Thread.__init__(self)

    def run(self):
    global is_done

    i = 0
    f = open(self.dest, "w")
    while True:
    if is_done:
    break
    self.semout.acquire()
    f.write(buf[i])
    i = (i+1) % self.bufn
    self.semin.release()
    f.close()

    n = 100
    buf = [0 for i in range(n)]
    semin = threading.Semaphore(n)
    semout = threading.Semaphore(0)

    url="http://www.google.com"
    dest = "tmp"
    if len(sys.argv) > 1:
    url = sys.argv[1]
    if len(sys.argv) > 2:
    dest = sys.argv[2]

    dl = Downloader(url=url, buf=buf, n=n, semin=semin, semout=semout)
    wr = Writer(dest=dest, buf=buf, n=n, semin=semin, semout=semout)
    dl.start()
    wr.start()