每X秒运行一次代码

时间:2018-07-11 08:43:40

标签: python python-3.x python-multithreading

我有一个无限循环,可以从串行端口读取字节,我想每X秒将读取的数据保存到Firebase数据库中。

我使用了以下代码段,但无济于事:

import threading

def printit():
  threading.Timer(5.0, printit).start()
  print "Hello, World!"

printit()

这是我的代码

import serial

ser = serial.Serial()
ser.baudrate = 115200
ser.port = "/dev/ttyUSB0"
ser.timeout = 30
try:
    try:
        while 1:
            line = ser.readline().rstrip().decode('utf-8')

            # print("save data here every X seconds)
    except KeyboardInterrupt:
        ser.close()  # Close port
        pass
except serial.serialutil.SerialException as e:
    print(str(e))

我不能使用睡眠,因为它阻塞了主线程,那么如何让代码连续读取并每隔X秒打印“保存的数据”(我将保存到数据库中)

2 个答案:

答案 0 :(得分:1)

感谢Lutz Horn在评论中的建议,我解决了这样的问题:

import schedule
import time
import serial

ser = serial.Serial()
ser.baudrate = 115200
ser.port = "/dev/ttyUSB0"
ser.timeout = 30

schedule.every(10).seconds.do(save_db)
try:
    try:
        while 1:
            schedule.run_pending()
            line = ser.readline().rstrip().decode('utf-8')
            # here every 10 seconds the function save_db will be called 
    except KeyboardInterrupt:
        ser.close()  # Close port
        pass
except serial.serialutil.SerialException as e:
    print(str(e))

答案 1 :(得分:0)

我希望我正确地理解了你。使用time.time()设置计时器。

import time

def doEvery_X_Seconds():
        print("I do it every X seconds")
        time.sleep(1)

TIMER_LIMIT = 5
setTimer = time.time()

while(1):

        print("hello world")
        if(time.time() - setTimer >= TIMER_LIMIT):
                doEvery_X_Seconds()
                setTimer = time.time()

time.sleep(1)仅用于演示其有效。