Какие-нибудь обходные пути для выбора Python и обработки EINTR в Linux? - PullRequest
2 голосов
/ 15 ноября 2011

В одном из моих недавних проектов, в которых я участвовал в том же процессе (программа на Python, это многопоточное приложение):

  • модуль Boost :: Python для библиотеки, которая связана с AVT PvAPI SDK , т. Е. В самом широком смысле драйвером для получения кадров изображения с камеры. Эта библиотека (PvApi SDK) выдает SIGALRM внутренне каждые несколько миллисекунд.

  • еще один простой модуль Python, который должен был выполнять некоторые последовательные операции ввода-вывода с использованием pyserial . Это, в свою очередь, использует оболочку Python select.select для POSIX select . Который оказывался прерванным (errno == EINTR) каждый раз, когда сигнал генерируется другим модулем.

  • та же проблема может наблюдаться при любом вызове Python time.sleep , соответственно. POSIX sleep , который используется внутри.

Эти проблемы, по-видимому, отсутствуют в Windows, так как спящий режим и выбор не будут прерваны никаким сигналом (согласно документации). И эти проблемы не являются большой проблемой в C / C ++, так как вы можете (и должны, хотя) перезапускать вызовы, если они были прерваны.

Однако, поскольку реализация Python ( исходный код / Modules / selectmodule.c) не обрабатывает этот случай (EINTR), я вынужден реализовать свой собственный последовательный драйвер C / C ++ и функцию сна использовать в Python? Или отойти от Python для этого проекта? Поскольку Python делает программирование намного проще, я очень заинтересован, если у кого-то возникли подобные проблемы и он нашел хороший обходной путь или простое решение для этого. Сейчас у меня нет возможности самостоятельно разработать необходимые исправления для модулей Python. Или, может быть, я пропустил какой-то другой вариант?

Есть идеи?

1 Ответ

0 голосов
/ 15 ноября 2011

Попробуйте использовать signal.sigintterupt, чтобы сигнал SIGALRM автоматически перезапускал системные вызовы. Или вы можете использовать signal.signal(signal.SIGALRM, signal.SIG_IGN), чтобы игнорировать сигнал тревоги, предполагая, что вы его не используете ни для чего.

...