使用线程下载安全地中断程序

时间:2011-01-18 14:19:33

标签: python multithreading web-scraping

我有一个(命令行/终端)程序,该程序使用工作线程从队列和下载索引文件的主线程(每页50个条目)中删除网站。如何让程序检查中断(CTRL + C或我自己定义的中断),当它捕获到这样的中断时,它将首先清理(下载剩余的队列)然后终止。

2 个答案:

答案 0 :(得分:2)

使用如下的异常处理程序包装等待线程完成的主函数:

try:
    main()
except KeyboardInterrupt:
    stop()

def stop():
    for t in threads:
        t.my_stop_function()
    # wait for threads to stop here...

class MyThread(threading.Thread):
    def __init__(self, *args, **kwargs):
        threading.Thread.__init__(self, *args, **kwargs)
        self.stop = False

    def my_stop_function(self):
        self.stop = True

    def run(self):
        while not self.stop:
            scrape()

答案 1 :(得分:1)

在主循环中,您希望捕获KeyboardInterrupt异常(当用户按CTRL-C时引发)。对于处理清理,您可以使用atexit模块运行一些全局清理函数,或使用threading.Event / threading.Condition通知工作线程自行清理并退出。

import atexit
atexit.register(cleanup_function)