В одном из моих недавних проектов, в которых я участвовал в том же процессе (программа на 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. Или, может быть, я пропустил какой-то другой вариант?
Есть идеи?