如何使用Python工作池停止KeyboardInterrupt上的所有线程

时间:2011-07-21 15:04:43

标签: python multithreading threadpool

这是我的Job类:

class QueryJob(workerpool.Job):
    "Job for downloading a given URL."
    def __init__(self, query):
        self.query = query # The query we'll need to download when the job runs

    def run(self):
        try:
            // Query something...
        except (Exception, KeyboardInterrupt, SystemExit):
            # TODO: The KeyboardInterrupt does not seem to work...
            print '*** shutting down ***'
            pool.shutdown()
            pool.wait()

这是我开始的方式:

# Initialize a pool, 12 threads in this case
pool = workerpool.WorkerPool(size=12)

# Loop over input file and create a job to download the URL on each line
for query in open(options.file):
    job = QueryJob(query)
    pool.put(job)

如果我希望它在完成之前停止,我按Ctrl-C,但没有任何反应。然后我反复尝试Ctrl-C也无济于事。最后,我将执行Ctrl-Z然后找到进程ID并执行kill -9以停止所有线程。

这是唯一想做的吗?有没有办法真正抓住KeyboardInterrupt,就像我上面试图做的那样?

注意,我在except sys.exit()raise中尝试过其他内容。但似乎它甚至没有达到这一点,一旦线程执行,Ctrl-C根本没有任何影响。

我缺少一些微不足道的东西吗?

感谢。

1 个答案:

答案 0 :(得分:0)

我发现了这个: http://code.activestate.com/recipes/577187-python-thread-pool/

它似乎与workerpool一样,但实际上会监听KeyboardInterrupt并暂停脚本。

这适合我,所以我用它来回答我自己的问题。我仍然想找到一种方法来使用workerpool,但对于其他任何具有相同情况的人 - 同时我建议使用Python线程模块,就像在上面的方法中所做的那样。