Убить зависание в Python в многопоточной среде - PullRequest
4 голосов
/ 16 января 2012

Я хотел бы убить функцию, которая выполняется долго. Что важно, эта функция - внутри расширения C (обернутая в Cython) , и я хотел бы, чтобы это решение работало в многопоточной среде. Поскольку он обернут в Cython, этот поток может содержать GIL.

У меня нет никакого контроля над тем, что происходит внутри этого расширения (и я думаю, что этот код не будет реагировать на прерывания).

Я вполне уверен, что этот код будет работать только на машинах Unix. Но вопрос Функция зависания Python не применяется, потому что я думаю, что сигналы не будут работать в многопоточной среде (AFAIK, это не определено, какой поток их перехватит) --- но я могу ошибаться в этом :) так поправь меня.

Могу ли я решить эту проблему, не создавая новые процессы?

1 Ответ

1 голос
/ 19 января 2012

Мое решение состоит в том, чтобы обернуть эту функцию в другой процесс Python и при необходимости убить этот процесс.

Совет для тех, кто ищет этот вопрос: поскольку время запуска процесса (запуск интерпретатора, загрузка модулей, а затем загрузка данных в память) может длиться пару секунд, вам нужно сгруппировать вызовы функций, чтобы эти издержки выиграли; t убить вас (так что на самом деле нет многоразового решения).

Пример решения, был опубликован еще один вопрос: Как прервать собственный код расширения, не убивая интерпретатора? .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...