这可能比我想象的要简单,但我想创建一个计时器,当达到一个限制(比如15分钟)时,会执行一些代码。
与此同时,每一秒,我都想测试一下情况。如果满足条件,则重置计时器并再次开始处理,否则倒计时继续。
如果在倒计时结束后满足条件,则执行一些代码并且计时器再次开始倒计时。
这是否涉及threading
还是可以通过简单的time.sleep()
功能实现?
答案 0 :(得分:2)
如果整个过程就像你说的一样简单,我会像这样(半伪代码):
def run_every_fifteen_minutes():
pass
def should_reset_timer():
pass
def main():
timer = 0
while True:
time.sleep(1)
timer+=1
if should_reset_timer():
timer = 0
if timer == 15*60:
run_every_fifteen_minutes()
timer = 0
请注意,这不会是十五分钟。可能会延迟几秒钟。睡眠不保证只能睡1秒,其余的循环也需要一些时间。如果你需要它真正准确的话,你可以在那里添加一个系统时间比较。
答案 1 :(得分:1)
你可以通过非常优雅的线程完成它,但如果你需要快速修复,你可以试试
import time
timer = 15 * 60 # 60 seconds times 15 mins
while timer > 0:
time.sleep(0.985) # don't sleep for a full second or else you'll be off
timer -= 1
if someCondition:
timer = 15 * 60
executeCode() # called when time is zero and while loop is exited
答案 2 :(得分:1)
感谢大家的帮助,你的回答指出了我正确的方向。最后我提出了:
#!/usr/bin/python
import RPi.GPIO as GPIO
import time
import subprocess
GPIO.setmode(GPIO.BCM)
PIR_PIN = 4
GPIO.setup(PIR_PIN, GPIO.IN)
timer = 15 * 60 # 60 seconds times 15 mins
subprocess.call("sudo /opt/vc/bin/tvservice -o", shell=True)
try :
print "Screen Timer (CTRL+C to exit)"
time.sleep(5)
print "Ready..."
while True:
time.sleep(0.985)
# Test PIR_PIN condition
current_state = GPIO.input(PIR_PIN)
if timer > 0:
timer -= 1
if current_state: #is true
# Reset timer
timer = 15 * 60
else:
if current_state: #is true
subprocess.call("sudo /opt/vc/bin/tvservice -p", shell=True)
# Reset timer
timer = 15 * 60
else:
subprocess.call("sudo /opt/vc/bin/tvservice -o", shell=True)
except KeyboardInterrupt:
print "Quit"
GPIO.cleanup()
为了说明问题,我使用PIR传感器检测运动并打开Raspberry Pi上的hdmi连接监视器。在没有移动15分钟后,我想关闭显示器,然后如果(稍后)检测到移动,再次将其重新打开并重新开始计时。
答案 3 :(得分:1)
说明听起来与dead main's switch / watchdog timer类似。它的实现方式取决于你的应用程序:是否存在事件循环,是否存在阻塞函数,是否需要单独的进程以进行适当的隔离等。如果代码中没有阻塞函数:
#!/usr/bin/env python3
import time
from time import time as timer
timeout = 900 # 15 minutes in seconds
countdown = timeout # reset the count
while True:
time.sleep(1 - timer() % 1) # lock with the timer, to avoid drift
countdown -= 1
if should_reset_count():
countdown = timeout # reset the count
if countdown <= 0: # timeout happened
countdown = timeout # reset the count
"some code is executed"
代码假定睡眠永远不会中断(注意:在Python 3.5之前,睡眠可能会被信号中断)。该代码还假设没有任何功能需要很长时间(大约一秒钟)。否则,您应该使用明确的截止日期(相同的代码结构):
deadline = timer() + timeout # reset
while True:
time.sleep(1 - timer() % 1) # lock with the timer, to avoid drift
if should_reset_count():
deadline = timer() + timeout # reset
if deadline < timer(): # timeout
deadline = timer() + timeout # reset
"some code is executed"
答案 4 :(得分:0)
也许您应该查看Linux工具cron来安排脚本的执行。