個人多線程程序以下:多線程
須要注意的是fetcher類,繼承threading.Thread類在初始化的時候將信號註冊一下就OK了。app
否則按下Ctrl+C終止的是當前的thread,不會終止全部的thread
fetch
class fetcher(threading.Thread):ui
def __init__(self, fname, outdir, url):url
threading.Thread.__init__(self)spa
signal.signal(signal.SIGINT, sigquit)線程
signal.signal(signal.SIGTERM, sigquit)繼承
self.fname = fnameci
self.outdir = outdir.replace("|", "_")get
self.outdir = self.outdir.replace("\\", "")
self.url = url
if not os.access(self.outdir, os.R_OK):
os.mkdir(self.outdir)
def run(self):
ftype = self.url.split('.')[-1]
fn = ''.join((self.outdir, "/", self.fname, ".", ftype))
self.get_pic(self.url, fn)
def get_pic(self, url, output):
command = "wget -q %s -O %s"%(url, output)
print url
os.system(command)
def fetch(works):
threads=[]
for work in works:
thr = fetcher(work[0], work[1], work[2])
thr.start()
threads.append(thr)
# for thr in threads:
# thr.join()
while threading.active_count() > 1:
time.sleep(0.1)
def sigquit(sig, frame) :
""" signal function of exit
"""
print "recieved a exit signal!!!"
sys.exit(0)