Python и измерение времени в мс и прерывание при достижении порога - PullRequest
2 голосов
/ 21 февраля 2012

Я использую nginx, web.py, fastcgi и redis в качестве стека.

После отправки запроса у меня есть 120 мсек, чтобы вернуть ответ, поэтому мне нужно всегда измерять ответ, и если я собираюсь приблизиться к порогу, мне нужно прервать и вернуть False. Я не буду наказан, если истина или ложь, только если я превышаю порог 120, где это исключение. Я ожидаю 10-50K QPS.

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

start = time.time()
r.get()
end = time.time - start
if end>115 then return False

если r.get () занимает слишком много времени, например 130 мс, потом меня наказывают.

Какова наилучшая практика python для мониторинга времени и отправки сигнала прерывания без процесса мониторинга, не требующего слишком много ресурсов? Я запускаю тему?

Использую ли я тайм-аут? если так то как в диапазоне MS?

Спасибо

1 Ответ

2 голосов
/ 23 февраля 2012

Это хорошее применение для декоратора в Python. Кто-то уже написал @ timeout decorator , который вы можете использовать следующим образом:

@timeout(timeout=2)
def return_later():
    time.sleep(3)
    return 'later'

Поскольку время ожидания> тайм-аут, вместо возврата «позже» будет сгенерировано исключение:

Traceback (most recent call last):
    ...
TimeoutException

Однако, поскольку реализация использует signal.alarm(), который занимает всего int, вы не можете указать доли секунды, только целые секунды. Поскольку, похоже, вы хотите использовать миллисекунды, вы можете адаптировать этот декоратор для использования signal.setitimer(). Или еще лучшее решение, если вы достаточно отважны, - отправить патч, как кто-то сделал для реализации функциональности setitimer для модуля signal для поддержки ualarm(), который обеспечивает разрешение в микросекундах и проще в использовании. чем setitimer().

...