【问题标题】:run code every X seconds每 X 秒运行一次代码
【发布时间】:2018-12-19 05:30:47
【问题描述】:

我有从串口读取字节的无限循环,我想每隔 X 秒将读取的数据保存到 firebase 数据库。

我使用了这个代码 sn-p 但它没有帮助:

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 秒打印一次“数据保存”(我将保存到数据库中)

【问题讨论】:

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


【解决方案1】:

我希望我正确地理解了你。使用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) 只是为了证明它有效。

【讨论】:

    【解决方案2】:

    感谢 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))
    

    【讨论】:

    • 另一种方法是将串行读取循环放在另一个线程中 [如图所示] (stackoverflow.com/a/17564557/9705687)。如果您使用的是 PyQt 或 Twisted 等其他框架,Python 线程可能会变得棘手。在这种情况下,您将分别使用 QThreads 或 loopingCall。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多