python下使用threading的多線程程序處理SIGINT(Ctrl+C)

個人多線程程序以下:多線程

須要注意的是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)

相關文章
相關標籤/搜索