2016-06-10 9 views
1

В 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() 

ответ

0

time.time() возвращается второй с начала эпохи в виде числа с плавающей точкой, как:

>>> import time 
>>> time.time() 
1465572505.891256 

Если сравнение:

time.time()-start) == times[0]

к time.time() не исправить до микросекунды (это зависит от системы), то == не будет True, и вы никогда не получите свой triggeredAction().

Поступайте на втором, если это работает для вас, используйте: int(time.time()) и сделать то же самое для uniform_min_range возвращаемых значений - если на второе разрешение нормально для вас. В противном случае вам необходимо ввести диапазон (+ или - 1) для проверки срабатывания.

+0

Спасибо RedCraig! Это сработало, но разрешение выборки кажется выше, чем на уровне второго. Это означает, что второй 1 повторяется много раз. Затем два вторых и т. Д. Знаете ли вы, почему это происходит? – Spica

+0

Причина, по которой я спрашиваю, заключается в том, что если вторая секунда должна вызвать действие, а вторая вторая повторяется, действие будет срабатывать несколько раз подряд. В идеале «частота дискретизации» также должна составлять каждую секунду. – Spica

+0

Ну, количество раз, которое он будет получать в секунду, зависит от количества итераций вашего цикла while, который ваш процессор может сделать за секунду. Если вы хотите, чтобы частота дискретизации составляла один раз в секунду, вы можете добавить код, чтобы проверить его вручную. Вместо этого вместо этого я использовал бы объект ['Threading.Timer'] (https://docs.python.org/2/library/threading.html#timer-objects). Перемещаем цикл while в метод, планируем метод с таймером, а в методе переносим метод повторно запускать в другую секунду. Как [этот] (http://stackoverflow.com/a/3393759/2175385) ответ делает. – RedCraig