time.sleep in a l oop, кажется, не работает правильно - PullRequest
0 голосов
/ 14 января 2020

Я использую входной сигнал моста phidget 4 для чтения тензодатчика. Я пытаюсь получить данные с частотой 1 Гц, поэтому я использую time.sleep(1) через некоторое время l oop для чтения данных каждую секунду по мере необходимости. Чтобы быть уверенным, что я на 1 Гц, я печатаю свое значение, в то время как actuel time - the time of the beginning of the script, и оно кажется больше 1000 мс при каждом l oop.

Код:

from Phidget22.Phidget import *
from Phidget22.Devices.VoltageRatioInput import *
import time

start_time = round(time.time()*1000)

A1 = -6.147057832630E-06
B1 = -0.000288253826519

def onVoltageRatioChange(self, voltageRatio):
    Masse = (voltageRatio - (B1) ) / (A1)
    self.masse = Masse


def runningChannel(channel, dataInterval):

        voltageRatioInput = VoltageRatioInput()
        voltageRatioInput.setChannel(channel)
        voltageRatioInput.setOnVoltageRatioChangeHandler(onVoltageRatioChange)
        voltageRatioInput.openWaitForAttachment(5000)
        voltageRatioInput.close()
        return voltageRatioInput.masse

if __name__ == '__main__':

    while True:
        print(str(round(time.time()*1000) - start_time) + " : " + str(runningChannel(1, 1000)))
        time.sleep(1)

Консоль:

0 : -0.6478727917378451
1353 : -0.7766034823455521
2530 : -0.648175863557032
3914 : -0.7572446275502878
5089 : -0.6493878254748858
6474 : -0.6990053837124224
7650 : -0.6493878254748858
9033 : -0.8542015809786906
10209 : -0.6509030218913868

Ответы [ 2 ]

1 голос
/ 14 января 2020

Похоже, у вас есть функции, которые могут занять некоторое время (например, openWaitForAttachment(5000)). добавьте это к 1-секундной задержке, которую вы добавили специально, и вы получите задержку, которая всегда немного больше 1 секунды. Если вы хотите преодолеть эту проблему, вам придется следить за временем (например, вы можете записывать время в начале каждой итерации, и после того, как ваш лог c побежал, ждет только оставшееся время)

1 голос
/ 14 января 2020

Вы забываете, что для выполнения вызова runningChannel() также требуется несколько раз.
Чтобы сделать что-то (все еще приблизительно) каждую секунду, вы можете использовать это l oop:

import time
while True:
    start_time = time.time()
    # your operations here
    time.sleep(1 - (time.time() - start_time))

Очевидно, что он потерпит неудачу, если ваша операция займет больше секунды

...