Выполняйте действие время от времени

#python #python-2.7 #datetime #time #sampling

#python #python-2.7 #дата и время #время #выборка

Вопрос:

В настоящее время я пытаюсь (Python 2.7) установить действие, которое будет выполняться с фиксированной частотой дискретизации (т. Е. Каждые x миллисекунд). Однако я сталкиваюсь с неточными результатами. С приведенным ниже кодом (частота дискретизации 1000 Гц, код выполняется в течение 5 секунд) Я ожидал бы иметь 5 * 10000 образцов. Вместо этого я получаю более низкие значения. Я хотел бы иметь частоту дискретизации в лучшем случае 5000 Гц, но я также был бы доволен частотой 1000 Гц.

Кто-нибудь может мне помочь?

 import datetime

count = 0
loop_start_time = start_time = datetime.datetime.now()

while datetime.datetime.now() - loop_start_time <= datetime.timedelta(0,5,0): #loop for 5 seconds
    if datetime.datetime.now() - start_time >= datetime.timedelta(0,0,1000): #perform an action every 1000 microseconds (1 millisecond, 0.1 seconds)
        start_time = datetime.datetime.now()
        count = count   1
print count
  

С наилучшими пожеланиями,
T2

Комментарии:

1. Есть ли какая-то конкретная причина, по которой вы используете datetime вместо таймера потоков?

2. docs.python.org/2/library/threading.html#timer-objects — для более подробной информации. У вас может быть внешний таймер, который отсчитывает 5000 миллисекунд (5 секунд), и внутри него другой таймер, который запускается каждые 1 мс.

3. Привет @Andrew. Большое спасибо за ваш ответ. Я не знал о таймере обработки потоков! Обрабатывает ли он частоту до 5000 Гц?

4. Привет, Эндрю. У меня возникают проблемы с использованием объектов timer, поскольку он запускается только один раз. Как мне заставить его работать, пока я не остановлю его? Это мой текущий тестовый код: import threading def hello(): print "hello, world" t = threading.Timer(5, hello) t.start() Если я помещаю код потока в цикл, он печатает значения в случайное (быстрое) время.

Ответ №1:

Сработает ли что-то подобное?

 import time
import threading

total_time = 5
increment_time = .1
is_running = False
count = 0

def incrementCounter(): 
  global count
  global is_running
  is_running = True
  threading.Timer(increment_time, incrementCounter).start()
  count  = 1
  # Any additional code should be put here

end_time = time.time()   total_time
while time.time() < end_time:
  if not is_running:
    incrementCounter()


print count
  

Вывод для этого я получаю ~ 50.

Комментарии:

1. Большое спасибо за это, это очень полезно. Однако это недостаточно надежно. При более высокой частоте дискретизации (например, increment_time = .01, 100 Гц) я получаю 325 выборок вместо 500. 🙁 Пока datetime что дает наилучшие результаты (до 100 Гц).

2. С помощью кода, который вы опубликовали выше, при разнице во времени 5 секунд и 1 секунду с уважением, я получаю вывод 4. При Timer этом он будет последовательно выводить 5 с той же конфигурацией. Я не уверен datetime , что это очень надежно даже с меньшими интервалами.