Created
July 10, 2012 09:26
-
-
Save zhangsen/3082270 to your computer and use it in GitHub Desktop.
Revisions
-
zhangsen created this gist
Jul 10, 2012 .There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal 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()