Python: недостатки использования `signal.alert` для тайм-аута ввода-вывода? - PullRequest
1 голос
/ 27 июля 2010

Каковы недостатки для использования signal.alert для тайм-аута ввода / вывода Python?

Я спрашиваю, потому что обнаружил, что socket.settimeout не совсем надежен [0] иМне бы хотелось более точно контролировать время ожидания для различных операций [1].

Итак, насколько я могу судить, недостатки:

  • Добавлены накладные расходы на вызов сигнала (ноесли вы делаете ввод / вывод, это не должно удивлять)
  • Это может стать «более сложным», если приложение использует многопоточность (но если многопоточность уже используется, порождение потока монитора будетпроще)

Я что-то пропустил?

[0]: например, это не приведет к задержке медленного поиска DNS.

[1]: напримерЯ хочу, чтобы у некоторых операций чтения был короткий тайм-аут, тогда как у других операций чтения должен быть более длинный тайм-аут.

1 Ответ

2 голосов
/ 27 июля 2010

При использовании сигналов и потоков вы, вероятно, не доберетесь далеко.Из документации по сигналу :

... только основной поток может установить новый обработчик сигнала, и основной поток будет единственным, чтобы получать сигналы (это принудительно выполняетсясигнальным модулем Python, даже если реализация базового потока поддерживает отправку сигналов отдельным потокам) ...

Что касается недостатков, интерпретатор будет вызывать обработчик сигнала только после того, как интерпретатор вернется квыполняется в контексте основного потока.Если у вас есть длительный вызов расширения C (SQL-запрос, системный ввод-вывод и т. Д.), То сигналы SIGINT и SIGTERM не будут обрабатываться до тех пор, пока они не вернутся.Если у вас есть строгие временные требования, которые вы соблюдаете, то это не поможет.Лучший способ найти способ обойти это - распределить задачи по дочернему процессу, использовать SIGKILL, чтобы завершить дочерний процесс по таймауту, а затем создать замещающий дочерний процесс (пользовательский пул процессов).

Кроме того, если вы хотите использовать обработчик сигнала как способ выпрыгнуть из блока кода с помощью асинхронно возбуждаемых исключений, то нет гарантии вменяемости состояния вашей программы.Само исключение может даже привести к тому, что его вызовут в непредусмотренных местах.

Для ваших нужд при программировании сокетов вы должны начать с использования неблокирующего ввода-вывода и цикла выбора для опросаготовность.Или вы можете использовать модуль asyncore или нестандартную библиотеку twisted , которая абстрагирует многие из этих деталей.

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