代码之家  ›  专栏  ›  技术社区  ›  Amine Harbaoui

每x秒运行一次代码

  •  0
  • Amine Harbaoui  · 技术社区  · 6 年前

    我有从串行端口读取字节的无限循环,我想每隔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))
    

    我不能使用sleep,因为它阻塞了主线程,所以如何让代码连续读取并每隔x秒打印一次“保存的数据”(在我的例子中,我将保存到数据库)

    2 回复  |  直到 6 年前
        1
  •  1
  •   Amine Harbaoui    6 年前

    感谢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))
    
        2
  •  0
  •   Alexej Luft    6 年前

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