2015-07-14 5 views
0

Мне нужно реализовать асинхронный таймер, чтобы «наблюдать» за исполнением списка функций до истечения таймера. Но проблема в том, что выполнение функции - это блокирующий вызов, и в этом случае, как я могу отслеживать таймер, если функция занимает слишком много времени, чтобы вернуться.Реализация асинхронного таймера в Python

functions = [func_1, func_2, func_3, func_n] 

timer = Timer(30) # timer of 30 sec, just for example. 
while timer.expires(): 
    for func in functions: 
     func() # what if this function runs for a min 

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

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

+0

Чтобы выяснить, выполняет ли каждая функция полные 30 секунд, или у вас есть 30 секунд, чтобы пройти через весь список? – dano

+0

Продолжительность таймера применяется для всех функций из списка, вместе взятых. –

ответ

1

Если функции, которые вы вызываете, блокируются из-за ввода-вывода, вы можете использовать модуль asyncio, чтобы превратить их в неблокирующиеся. В этот момент вы завершаете их в будущее и устанавливаете тайм-аут для их завершения. Имейте в виду, что тайм-аут рассматривает только IO.

Если функции блокируются из-за заданий с привязкой к ЦП (в то время как циклы, длинные вычисления), нет способа достичь этого без использования процессов.

Смежные вопросы