Вместо этого вы можете рассмотреть возможность использования модуля 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
, который вы можете использовать для извлечения различных временных разностей.
Можно использовать пакет сигнала при работе 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