几分钟后如何中断一会儿循环?

时间:2020-03-24 07:37:05

标签: python time while-loop python-datetime

我的python程序中有一个while循环,我想在5分钟后从该循环中var media = SystemMediaTransportControls.GetForCurrentView(); var status = media.PlaybackStatus; Debug.WriteLine("Media status " + status); ,我目前正在使用以下代码:

break

但是,每次迭代都需要花费更多的时间来计算start_time = time.time() while time.time() - start_time < 300: # do something 部分。例如,如果我使用time.time() - start_time < 300:循环进行30000次迭代,并且持续5分钟,则上面的代码执行的迭代次数将少于该循环。

该怎么办?我必须在5分钟后打破循环,我只想按时间处理此问题,而不是按for循环进行处理。

我的一个朋友建议使用datetime软件包,但我不知道它是如何工作的。

5 个答案:

答案 0 :(得分:0)

上面的代码执行的迭代次数少于此。

一个可能的原因是检查时间本身会花费时间。因此,您可以减少检查时间的次数:

start_time = time.time()
lv = 0
while True:
    if lv == 100: # check time only once in 100 iterations
        if time.time() - start_time > 300:
            break
        else:
            lv = 0

    # do something

    lv +=1

答案 1 :(得分:0)

听起来我需要实现超时。您可以通过以下方式使用内置的threading模块:

import time
from threading import Thread, Event

stop = Event()

def function():
    while not stop.is_set():
        print('*')
        time.sleep(1)

thread = Thread(target=function)

thread.start()
thread.join(timeout=60)
stop.set()

以上代码仅在*秒内每秒打印一次60

答案 2 :(得分:0)

我认为使用线程和睡眠是最好的方法。您可以使用lambda函数以简单的方式创建休眠的后台线程,并简单地检查该线程是否仍在循环内运行(时间到时中断循环):

UPDATE

这应该为您的处理循环增加更少的开销,因此超时的迭代应该与处理相同数量的迭代的有效时间非常接近。

[EDIT]线程/睡眠与时间的关系.time()

我进行了更多测试,并且使用睡眠线程和优化使用time()函数之间的区别很小。每次迭代的开销小于一微秒:

from threading import Thread
from time import sleep

fiveMinutes = Thread(target=lambda:sleep(300)) # 5 min sleeping thread (300 seconds)
fiveMinutes.start() # start wait time

for i in range(10**10): # <-- this represents your loop condition
    # ...
    if not fiveMinutes.is_alive(): break # break after 5 minutes elapsed
    # ...

如果在1分钟的样本中有3秒的差异,我怀疑您的逻辑处理时间具有其自身的可变性(即,在循环中运行相同数量的迭代会在一次运行与下一次运行之间有所不同) )。要么,要么您检查超时的次数比11,311迭代建议的次数更多(也许通过检查嵌套循环内部)。在我的测试中,这两种方法在执行41,000次迭代的60秒样本中的变化时间小于0.5秒:time()为+ 0.37sec,线程为+ 0.23sec。

答案 3 :(得分:0)

(稍作修改,我想我大致同意Alain的观点。我得到了明显的提速,从经过一定数量的迭代后就中断了,但是无论是直接使用线程,time.time还是部分使用抽样方法,几乎​​所有方法最终都会降低循环时间。time.time()本身已经进行了高度优化,因此,避免使用过多的所有额外布尔值和东西可能并不会改善太多)。 / em>

不知道它是否更有效,但是您可以尝试使用线程和共享的可变对象来驱动循环。这是0.5秒的测试。

import time
from threading import Thread

def myfunc(mutable_):
    time.sleep(0.5)
    mutable_.value = False
    print("done")


class Mutable:
    value = True

mutable_ = Mutable()

t = Thread(target=myfunc, args=(mutable_,))

start = time.time()
t.start()
while mutable_.value:
    print(time.time() - start)

对我来说,未知的是循环的对mutable_.value的属性访问是否比轮询线程本身便宜得多,time.time()不需要直接涉及线程。

现在,在我的测试中,线程还没有更新该值,因此与使用自己的本地时间检查相比,循环有些滞后了。可能会将您的线程超时设置为299.9秒,关闭并更仔细地完成。

这是一个使用线程休眠的v2,可以到达那里的大部分时间(0.49),并且通常会短路def myfunc(mutable_, looptime): time.sleep(looptime) mutable_.value = False t = Thread(target=myfunc, args=(mutable_,.49)) t.start() start = time.time() while mutable_.value or (time.time() - start <= .5): print(time.time() - start) 检查以完成操作。

discord.Message

答案 4 :(得分:-1)

请尝试以下操作:

start_time = time.time() + 300
while True:
    if time.time() > start_time:
         break