правильный способ запустить код с таймаутом в Python

Я поискал в Интернете и нашел несколько обсуждений SO и рецептов ActiveState для запуска некоторого кода с таймаутом. Похоже, есть несколько общих подходов:

  • Используйте поток, который запускает код, и присоедините к нему с таймаутом. Если таймаут истек - убить поток. Это не поддерживается напрямую в Python (используется частная функция _Thread__stop ), поэтому это плохая практика
  • Использование signal.SIGALRM - но этот подход не работает на Windows !
  • Используйте подпроцесс с тайм-аутом - но это слишком тяжело - что, если я хочу часто запускать прерываемую задачу, я не хочу запускать процесс для каждого!

Итак, что такое правильный путь ? Я не спрашиваю об обходных путях (например, используйте Twisted и асинхронный ввод-вывод), а о реальном способе решения реальной проблемы - у меня есть функция, и я хочу запустить ее только с некоторым таймаутом. Если истекло время ожидания, я хочу вернуть управление. И я хочу, чтобы он работал в Linux и Windows.

30
задан zaharpopov 4 August 2011 в 18:59
поделиться