У меня есть сценарий сервера, который мне нужно, чтобы иметь возможность отключиться. При тестировании обычных заявлений try..except
я понял, что Ctrl-C
не работает обычным способом. Обычно я обернуть долго выполняющиеся задачи, как этотПочему мой сценарий python для многопоточности/многопроцессорности не работает правильно?
try:
...
except KeyboardInterrupt:
#close the script cleanly here
так может быть задача отключения чисто на Ctrl-C
. Я никогда не сталкивался с какими-либо проблемами с этим раньше, но почему-то, когда я нажимаю Ctrl-C
, когда этот конкретный скрипт запускается, сценарий просто выходит, не вылавливая Ctrl-C
.
Начальная версия была реализована с использованием Process
от multiprocessing
. Я переписал сценарий, используя Thread
от threading
, но такой же вопрос есть. Я использовал threading
много раз раньше, но я новичок в библиотеке multiprocessing
. В любом случае, я никогда не испытывал этого поведения Ctrl-C
.
Обычно я всегда применял часовые и т. Д., Чтобы закрыть Queues
и Thread
экземпляры упорядоченным образом, но этот скрипт просто выходит без ответа.
Последний, я попытался перекрывая signal.SIGINT
, а как этот
def handler(signal, frame):
print 'Ctrl+C'
signal.signal(signal.SIGINT, handler)
...
Здесь Ctrl+C
был на самом деле поймали, но обработчик не выполняет, он никогда не печатает ничего.
Помимо аспекта threading
/multiprocessing
, части сценария содержит C++
SWIG
объектов. Я не знаю, связано ли это с этим. Я запускаю Python 2.7.2 на OS X Lion.
Итак, несколько вопросов:
- Что здесь происходит?
- Как я могу отладить это?
- Что мне нужно, чтобы узнать, чтобы понять первопричину?
ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ: внутренности скрипта являются собственностью, поэтому я не могу привести примеры кода. Тем не менее, я очень хочу получить указатели, чтобы сам отлаживал это. Я достаточно опытен, чтобы понять это, если кто-то может указать мне в правильном направлении.
EDIT: я начал комментирование импорта и т.д., чтобы увидеть, что вызвало странное поведение, и я сузил его до ввоза C++ SWIG
библиотеки. Любые идеи, почему импорт библиотеки C++ SWIG
«ворует» Ctrl-C
? Однако я не являюсь автором виноватой библиотеки, и мой опыт SWIG ограничен, поэтому не знаю, с чего начать ...
EDIT 2: Я просто попробовал один и тот же скрипт на машине для Windows и в Windows 7 Ctrl-C
пойман как и ожидалось. Я не собираюсь беспокоиться о части OS X, сценарий будет работать в среде Windows в любом случае.
Невозможно сказать, не зная, что вы делаете между 'try:' и 'except ...:'. Код C++ что-то делает с сигналами? Если так, то все может случиться. –
[полный минимальный пример] (http://sscce.org/) может помочь. – jfs
Извините, не может этого сделать. Однако я добавил некоторые выводы. Я все уши для SWIG-мнений и предложений ... – c00kiemonster