Как остановить все потоки в KeyboardInterupt с помощью рабочего пула Python - PullRequest
0 голосов
/ 21 июля 2011

Это мой класс работы:

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, а затем найду идентификатор процесса и сделаю kill -9, чтобы остановить все потоки.

Это единственный, кто хочет это сделать? Нет ли способа на самом деле поймать KeyboardInterrupt, как я пытаюсь сделать выше?

Обратите внимание, в except я пробовал другие вещи, такие как sys.exit() и raise. Но кажется, что он даже не достигает этой точки, и Ctrl-C не оказывает никакого влияния на выполнение потоков.

Есть что-то тривиальное, что я упускаю?

Спасибо.

1 Ответ

0 голосов
/ 21 июля 2011

Я нашел это: http://code.activestate.com/recipes/577187-python-thread-pool/

Кажется, что он работает так же, как рабочий пул, но на самом деле будет прослушивать KeyboardInterrupt и останавливать сценарий.

Это работает для меня, поэтому я отвечаю на свой вопрос. Я все еще нахожусь в поиске способа использования workerpool, но для всех, кто сталкивается с такой же ситуацией, - тем временем я рекомендую использовать модуль потока Python, как это сделано в приведенном выше рецепте.

...