在Python中的while true循环中使用计时器

在Python中的while true循环中使用计时器,python,python-2.7,timer,while-loop,exit,Python,Python 2.7,Timer,While Loop,Exit,我在管理Python中的无限while循环时遇到了一个问题,在这个循环中,我会插入一个计时器作为一种“看门狗”。我试图更好地解释:脚本必须在串行通道上侦听,并等待来自通道另一侧连接的传感器的消息。 我使用while-True循环来实现这一点,因为脚本必须捕获正在传递的所有信号。然而,即使它可能是不必要的,我想插入一个计时器,它总是重置每个循环。因此,如果(例如)循环由于某种原因被卡住,计时器将结束并退出程序。我想我可以这样做: def periodicUpdate(): exitTime

我在管理Python中的无限while循环时遇到了一个问题,在这个循环中,我会插入一个计时器作为一种“看门狗”。我试图更好地解释:脚本必须在串行通道上侦听,并等待来自通道另一侧连接的传感器的消息。 我使用while-True循环来实现这一点,因为脚本必须捕获正在传递的所有信号。然而,即使它可能是不必要的,我想插入一个计时器,它总是重置每个循环。因此,如果(例如)循环由于某种原因被卡住,计时器将结束并退出程序。我想我可以这样做:

def periodicUpdate():
    exitTimer = threading.Timer(60.0, sys.exit())
    while True:
        exitTimer.start()
        readData()
        exitTimer.cancel()
现在的问题是,当我启动脚本时,它会立即退出。它似乎比其他所有函数都要先读取
sys.exit()
,而且它不考虑计时器的构造,只是在调用periodicUpdate时退出。为什么会这样?!我尝试更改语法,将sys.exit放在另一个函数中并调用该函数,我尝试了其他解决方案,但它总是以两种方式运行:它退出或它的行为与计时器不存在一样。有人能帮我吗?非常感谢

它似乎比其他所有代码都先读取
sys.exit()

当然有。
threadint.Timer
的第二个参数是将被调用的函数。您要做的是实际调用sys.exit,并将其返回值作为要调用的函数提供(顺便说一句,由于调用终止了程序,因此返回值未定义)。这是一个错误,因为
sys.exit
的返回值不是函数,但这并不重要,因为程序无论如何都会终止

你想做的是

exitTimer = threading.Timer(60.0, sys.exit) # note: no brackets
但这实际上不会起作用,因为线程中的
sys.exit
。简言之,如果主线程中存在卡住的
循环,则不能使用看门狗终止该循环。在您的特定情况下,您应该研究用于读取数据的函数,它很可能允许您设置读取超时

它似乎比其他所有代码都先读取
sys.exit()

当然有。
threadint.Timer
的第二个参数是将被调用的函数。您要做的是实际调用sys.exit
,并将其返回值作为要调用的函数提供(顺便说一句,由于调用终止了程序,因此返回值未定义)。这是一个错误,因为
sys.exit
的返回值不是函数,但这并不重要,因为程序无论如何都会终止

你想做的是

exitTimer = threading.Timer(60.0, sys.exit) # note: no brackets

但这实际上不会起作用,因为线程中的
sys.exit
。简言之,如果主线程中存在卡住的
循环,则不能使用看门狗终止该循环。在特定情况下,您应该研究用于读取数据的函数,它很可能允许您设置读取超时。

删除括号。如果使用
sys.exit()
,它将立即开火。使用
sys.exit
时,它会将函数作为
Timer
的第二个参数传递。

删除括号。如果使用
sys.exit()
,它将立即开火。使用
sys.exit
时,它会将函数作为
Timer
的第二个参数传递。

在Timer调用中从sys.exit中删除()

exitTimer = threading.Timer(60.0, sys.exit)
def _exit()
    sys.exit()

def periodicUpdate():
    exitTimer = threading.Timer(60.0, _exit)
    while True:
        exitTimer.start()
        readData()
        exitTimer.cancel()
在()中,解释器调用此函数,如果不是,解释器将获取此函数的引用

玩得开心:)

编辑:使用_exit

在计时器调用中从sys.exit中删除()

def _exit()
    sys.exit()

def periodicUpdate():
    exitTimer = threading.Timer(60.0, _exit)
    while True:
        exitTimer.start()
        readData()
        exitTimer.cancel()
def periodicUpdate():
    exitTimer = sys.exit(60.0, sys.exit())
    while sys.exit():
        sys.exit()
        readData()
        sys.exit()

if __name__ == "__main__":
    sys.exit()
在()中,解释器调用此函数,如果不是,解释器将获取此函数的引用

玩得开心:)

编辑:使用_exit

def periodicUpdate():
    exitTimer = sys.exit(60.0, sys.exit())
    while sys.exit():
        sys.exit()
        readData()
        sys.exit()

if __name__ == "__main__":
    sys.exit()
不要忘记导入系统


不要忘记导入sys。

我认为您的方法不是最好的方法,与其运行退出应用程序的计时器,为什么不简单地使读取数据的函数超时:


我认为您的方法不是最好的方法,与其运行退出应用程序的计时器,不如简单地让读取数据的函数超时:


在我看来,这里提出的解决方案实际上都不起作用。这是一个代码示例。如果知道如何修复它,那就太好了。另外,请在回答之前尝试一下

import time, threading, sys

def _exit():
    print 'exiting'
    sys.exit()

def periodicUpdate():
    exitTimer = threading.Timer(2.0, _exit)
    while True:
        exitTimer.start()
        print 'go'
        time.sleep(5)
        exitTimer.cancel()


periodicUpdate()
实际输出为:

$python test.py
go
exiting
RuntimeError: threads can only be started once

在我看来,这里提出的解决方案实际上都不起作用。这是一个代码示例。如果知道如何修复它,那就太好了。另外,请在回答之前尝试一下

import time, threading, sys

def _exit():
    print 'exiting'
    sys.exit()

def periodicUpdate():
    exitTimer = threading.Timer(2.0, _exit)
    while True:
        exitTimer.start()
        print 'go'
        time.sleep(5)
        exitTimer.cancel()


periodicUpdate()
实际输出为:

$python test.py
go
exiting
RuntimeError: threads can only be started once

谢谢你的回答。我像你说的那样试过了,但是没有括号,脚本的行为就像计时器不存在一样。它不会退出。它继续迭代@说哦,当然,
sys.exit
在线程中不起作用,我完全忘记了。我将更新我的答案。谢谢更新:)我将尝试调查,然后我将再次更新您的答案谢谢。我像你说的那样试过了,但是没有括号,脚本的行为就像计时器不存在一样。它不会退出。它继续迭代@说哦,当然,
sys.exit
在线程中不起作用,我完全忘记了。我会更新我的答案。谢谢更新:)我会尝试调查,然后我会按照上面的相同方式再次更新:)谢谢你的答案。但是没有括号,脚本的行为就像计时器不存在一样。它不会退出。它继续迭代!同上:)谢谢你的回答。但是没有括号,脚本的行为就像计时器不存在一样。它不会退出。它继续迭代!嗨,谢谢你的帮助!问题是,如果我删除括号,脚本的行为就像计时器不存在一样。它不会退出…在尝试i get:RuntimeError时:线程只能启动一次。您可能需要在每个循环中创建一个新的计时器吗?老实说,我没有收到任何错误!我的计时器根本没有启动:D循环继续迭代…:SHi,an