【问题标题】:Let Python keep loop statement running and check the condition every 3 seconds让 Python 保持循环语句运行并每 3 秒检查一次条件
【发布时间】:2019-03-05 15:08:42
【问题描述】:

我想保持循环条件语句运行,但不要总是检查条件。

例如,如果条件为真,那么在接下来的 3 秒内,循环的条件语句会运行,然后在第 3 秒后检查条件,然后重复此过程。

我不想等待或睡眠三秒钟,我希望我的循环工作三秒钟。然后检查它是否应该像@RemcoGerlich 提到的那样继续另外三个

while if_active() == True:    #check the condition every 3 seconds` 
   try:               # it will keep running in 3 seconds if if_active() is true  
       with open(masterpath, 'r') as f:
            s = f.read()
        exec(s)

【问题讨论】:

  • 请修正你的缩进。
  • 等待 3 秒是没有意义的,除非您使用操作系统中的某些东西来让您的进程进入睡眠状态。否则它会在你等待的时候继续吃 CPU。
  • 你是说读取文件和exec(s)需要三秒才能运行?
  • while if_active() == True: 替换为while if_active(): 更为惯用。
  • 我觉得每个人都误读了他的问题。他不想等待或睡眠三秒钟,他希望他的循环工作三秒钟。然后检查它是否应该再持续三个。

标签: python python-3.x loops while-loop


【解决方案1】:

这是一种有趣且异步的方式。只是为了好玩,带有activateing 的演示

import signal, os
import time

def handler(signum, frame):
    for i in range(3):
        print("foo bar")
        time.sleep(0.1)
    signal.alarm(3)

# Set the signal handler and a 5-second alarm
signal.signal(signal.SIGALRM, handler)
signal.alarm(3)

while True:
    try:
        active = not active
        if not active:
            signal.alarm(0)
        time.sleep(60)
    except KeyboardInterrupt as interrupt:
        # demonstrating activate, with ctrl+c
        signal.alarm(3)

【讨论】:

  • 他的 if_active() 检查会去哪里?
  • 添加了激活。
【解决方案2】:

您可以跟踪上次检查的时间,只有在三秒后才重新检查。

from datetime import datetime, timedelta

INTERVAL = timedelta(minutes=3)
last_checked = datetime.now() - INTERVAL

while True:
    now = datetime.now()
    if last_checked <= (now - INTERVAL):
        if not if_active():
            break
        last_checked = now

    # do your thing here
    pass

这可以使用一些重构,但这个想法应该可行。

【讨论】:

  • 看来last_checked会在3秒内更新。我认为它应该在 3 秒后更新。
  • 最后一件事,初始last_checked 应该是datetime.now()
  • @Andy:这取决于,在这种情况下它不会第一次运行 if_active() 。
【解决方案3】:

您可以使用 sleep 之类的命令来避免连续运行。您可以在此线程中看到更详细的答案:How can I make a time delay in Python?

【讨论】:

  • time.sleep() 当然可以,但如果 exec(s) (随机)花费 0 到 3 秒之间的任何时间运行,则总循环时间将变为 3 到 6 秒之间(以及所有赌注如果exec(s) 花费的时间超过 3 秒,则关闭)。不幸的是,OP 未能阐明他们到底想要什么,使这个问题变得模棱两可,所有答案都可能是正确的。
猜你喜欢
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2017-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-28
相关资源
最近更新 更多