这是我的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根本没有任何影响。
我缺少一些微不足道的东西吗?
感谢。
答案 0 :(得分:0)
我发现了这个: http://code.activestate.com/recipes/577187-python-thread-pool/
它似乎与workerpool一样,但实际上会监听KeyboardInterrupt并暂停脚本。
这适合我,所以我用它来回答我自己的问题。我仍然想找到一种方法来使用workerpool,但对于其他任何具有相同情况的人 - 同时我建议使用Python线程模块,就像在上面的方法中所做的那样。