LINUX.ORG.RU

Ctrl-C многопоточной программы на Python


0

3
#!/usr/bin/python
# -*- coding: utf-8 -*-

import threading
import Queue

import time
def worker():
    while True:
        item = q.get()
        time.sleep(60)
        print item
        q.task_done()

num_worker_threads = 20
q = Queue.Queue()
for i in range(num_worker_threads):
     t = threading.Thread(target=worker)
     t.daemon = True
     t.start()

def source():
  return range(100)

for item in source():
    q.put(item)

q.join()       # block until all tasks are done

Как исправить эту программу, чтобы Ctrl-C срабатывал, и прибивал нити (потоки)?

Вот эти слайды (стр. 22 - 25) меня опечалили: http://www.dabeaz.com/python/GIL.pdf
Неужели, никак не сделать?

★★★★★

В принципе, сделал через обработчик SIGINT:

...
f = False

import signal
import sys
def signal_handler(signal, frame):
  global f
  f = True

signal.signal(signal.SIGINT, signal_handler)
print 'Press Ctrl+C'
import time

def worker():
    while True:
        item = q.get()
        time.sleep(5)
        print item
        q.task_done()
        if f: break
...
signal.pause()
Вроде, то что нужно.

any comments?

pacify ★★★★★ ()
Ответ на: комментарий от strangeman

Добавь SIGTERM и иже с ним

Ок. Спасибо, что напомнил. Шабашки делаю.

pacify ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.