在Python中的while true循环中使用计时器
我在管理Python中的无限while循环时遇到了一个问题,在这个循环中,我会插入一个计时器作为一种“看门狗”。我试图更好地解释:脚本必须在串行通道上侦听,并等待来自通道另一侧连接的传感器的消息。 我使用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
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