В Python я хотел бы запустить функцию, вызывающую действие по умолчанию в течение 20 секунд. Тем не менее, в течение этих 20 секунд есть 5 конкретных таймингов, когда должна запускаться другая функция. Чтобы упростить мой код, я заменил функции «действия» на простые команды печати.Таймер Python для запуска определенных событий
Вот что у меня есть до сих пор. Выход кажется одобренным, поскольку он длится 10 секунд и печатает время и состояние/действие по умолчанию. Но сработавшего действия не хватает! Есть ли лучший/правильный способ сделать это?
import random
import time
import numpy as np
import itertools
def uniform_min_range(a, b, n, min_dist):
while True:
atimes = np.random.uniform(a, b, size=n)
np.sort(atimes)
if np.all(np.diff(atimes) >= min_dist):
return atimes
def timings():
global times
times = uniform_min_range(0, 20, 5, 1.0)
print 'beep times: ', times
def defaultAction():
global start
print 'wobble'
def triggeredAction():
global start
print 'actionnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn'
def main():
global times
timings()
print 'beep times: ', times
start = time.time()
t_end = time.time() + 20 #### end after 20 seconds
while time.time() < t_end: #### for 20 sec/ until end reached
print str(time.time()-start)
if (time.time()-start) == times[0] or (time.time()-start) == times[1] or (time.time()-start) == times[2] or (time.time()-start) == times[3]:
triggeredAction()
elif (time.time()-start) != times[0] or (time.time()-start) != times[1] or (time.time()-start) != times[2] or (time.time()-start) != times[3]:
defaultAction()
print "END"
main()
Спасибо RedCraig! Это сработало, но разрешение выборки кажется выше, чем на уровне второго. Это означает, что второй 1 повторяется много раз. Затем два вторых и т. Д. Знаете ли вы, почему это происходит? – Spica
Причина, по которой я спрашиваю, заключается в том, что если вторая секунда должна вызвать действие, а вторая вторая повторяется, действие будет срабатывать несколько раз подряд. В идеале «частота дискретизации» также должна составлять каждую секунду. – Spica
Ну, количество раз, которое он будет получать в секунду, зависит от количества итераций вашего цикла while, который ваш процессор может сделать за секунду. Если вы хотите, чтобы частота дискретизации составляла один раз в секунду, вы можете добавить код, чтобы проверить его вручную. Вместо этого вместо этого я использовал бы объект ['Threading.Timer'] (https://docs.python.org/2/library/threading.html#timer-objects). Перемещаем цикл while в метод, планируем метод с таймером, а в методе переносим метод повторно запускать в другую секунду. Как [этот] (http://stackoverflow.com/a/3393759/2175385) ответ делает. – RedCraig