Тайм-аут на вызове функции

Вместо этого вы можете рассмотреть возможность использования модуля time, это вернет время UNIX в секундах, чтобы вы могли легко найти разницу между двумя разами в секундах, а затем при желании вы можете преобразовать ее в формат строки времени. [118 ]

import time
start = time.time()
time.sleep(1)
end = time.time()
delta = end - start

Или, все еще используя datetime, вы можете удалить вызов .time() в своем коде

start = datetime.datetime.now()
time.sleep(1)
end = datetime.datetime.now()
delta = end - start

Это возвращает объект timedelta, который имеет такие свойства, как .days, .seconds, .microseconds, который вы можете использовать для извлечения различных временных разностей.

257
задан martineau 23 May 2016 в 10:52
поделиться

1 ответ

Можно использовать пакет сигнала при работе UNIX:

In [1]: import signal

# Register an handler for the timeout
In [2]: def handler(signum, frame):
   ...:     print "Forever is over!"
   ...:     raise Exception("end of time")
   ...: 

# This function *may* run for an indetermined time...
In [3]: def loop_forever():
   ...:     import time
   ...:     while 1:
   ...:         print "sec"
   ...:         time.sleep(1)
   ...:         
   ...:         

# Register the signal function handler
In [4]: signal.signal(signal.SIGALRM, handler)
Out[4]: 0

# Define a timeout for your function
In [5]: signal.alarm(10)
Out[5]: 0

In [6]: try:
   ...:     loop_forever()
   ...: except Exception, exc: 
   ...:     print exc
   ....: 
sec
sec
sec
sec
sec
sec
sec
sec
Forever is over!
end of time

# Cancel the timer if the function returned before timeout
# (ok, mine won't but yours maybe will :)
In [7]: signal.alarm(0)
Out[7]: 0

спустя 10 секунд после вызова alarm.alarm(10), обработчик называют. Это повышает исключение, которое можно прервать из обычного кода Python.

Этот модуль не играет хорошо с потоками (но затем, кто делает?)

Примечание, что , так как мы повышаем исключение, когда тайм-аут происходит, он может закончиться пойманный и проигнорированный в функции, например, одной такой функции:

def loop_forever():
    while 1:
        print 'sec'
        try:
            time.sleep(10)
        except:
            continue
203
ответ дан satoru 23 November 2019 в 02:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: