Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在n个时间量之后,如何停止while循环?_Python_Python 2.7 - Fatal编程技术网

Python 在n个时间量之后,如何停止while循环?

Python 在n个时间量之后,如何停止while循环?,python,python-2.7,Python,Python 2.7,如果5分钟后while循环没有达到我想要的效果,我将如何停止它 while true: test = 0 if test == 5: break test = test - 1 这段代码让我陷入了无休止的循环。请尝试以下操作: import time timeout = time.time() + 60*5 # 5 minutes from now while True: test = 0 if test == 5 or time.t

如果5分钟后while循环没有达到我想要的效果,我将如何停止它

while true:
    test = 0
    if test == 5:
        break
    test = test - 1
这段代码让我陷入了无休止的循环。

请尝试以下操作:

import time
timeout = time.time() + 60*5   # 5 minutes from now
while True:
    test = 0
    if test == 5 or time.time() > timeout:
        break
    test = test - 1
您可能还想在此处添加一个短睡眠,以便此循环不会占用CPU(例如,在循环正文的开头或结尾添加
time.sleep(1)
)。

尝试此模块:


在这种情况下,不需要使用
while True:
循环。有一种更简单的方法可以直接使用时间条件:

import time

# timeout variable can be omitted, if you use specific value in the while condition
timeout = 300   # [seconds]

timeout_start = time.time()

while time.time() < timeout_start + timeout:
    test = 0
    if test == 5:
        break
    test -= 1
导入时间
#如果在while条件中使用特定值,则可以省略timeout变量
超时=300#[秒]
timeout\u start=time.time()
while time.time()
在我看来,Petr Krampl的答案是最好的,但关于循环的性质以及如何优化系统的使用,还需要更多的说明。初学此道的人可能会被问题和现有答案中的逻辑和算法错误弄糊涂

首先,让我们看看您的代码在最初编写时做了什么:

while True:
    test = 0
    if test == 5:
        break
    test = test - 1
如果你在循环上下文中说
,而说True
,通常你的意图是永远留在循环中。如果这不是你的意图,你应该考虑循环结构的其他选项。Petr Krampl向您展示了一种完全合理的方法来处理此问题,这对于可能阅读您的代码的其他人来说更加清楚。此外,如果您需要重新访问代码以添加或修复某些内容,几个月后您会更加清楚。编写良好的代码是文档的一部分。做事情通常有多种方法,但这并不意味着所有方法在所有情况下都同样有效
而true
就是一个很好的例子,尤其是在这种情况下

接下来,我们将查看原始代码中的算法错误。在循环中要做的第一件事是将0分配给
test
。接下来要做的就是检查
test
的值是否为5,除非有多个线程修改同一个内存位置,否则永远不会出现这种情况。线程不在本文讨论的范围内,但值得注意的是,代码在技术上是可以工作的,但即使有多个线程,也会丢失很多东西,例如信号量。不管怎样,你将永远坐在这个循环中,不管哨兵是在强迫一个无限循环

无论执行什么操作,语句
test=test-1
都是无用的,因为变量在循环的下一次迭代开始时被重置。即使将其更改为
test=5
,循环仍然是无限的,因为每次都会重置该值。如果将初始化语句移到循环之外,那么它至少有机会退出。您可能打算这样做:

test = 0
while True:
    test = test - 1
    if test == 5:
        break
import time

tCurrent = time.time()

while True:
    if time.time() >= tCurrent + 1:
        print "Time = %d" % time.time()
        tCurrent = time.time()
循环中语句的顺序取决于程序的逻辑。不过,这两种顺序都可以,这是主要的一点

下一个问题是从0开始,连续减去1,然后与正数进行比较的潜在和可能的逻辑错误。是的,在某些情况下,只要你理解其中的含义,这实际上可能就是你想要做的,但这很可能不是你想要的。当您达到整数范围的“底部”时,python的较新版本将不会自动结束,例如C和其他各种语言。它将允许您继续减去1,直到您已填满系统上的可用内存或至少分配给进程的内存。查看以下脚本和结果:

test = 0

while True:
    test  -= 1

    if test % 100 == 0:
        print "Test = %d" % test

    if test == 5:
        print "Test = 5"
        break
这就产生了:

Test = -100
Test = -200
Test = -300
Test = -400
...
Test = -21559000
Test = -21559100
Test = -21559200
Test = -21559300
...
test
的值永远不会是5,因此此循环永远不会退出

为了补充Petr Krampl的答案,这里有一个版本可能更接近您的实际意图,除了在一段时间后退出循环之外:

import time

test = 0
timeout = 300   # [seconds]

timeout_start = time.time()

while time.time() < timeout_start + timeout:
    if test == 5:
        break
    test -= 1
输出结果如下:

Time = 1498226796
Time = 1498226797
Time = 1498226798
Time = 1498226799
进程CPU使用情况如下所示:

test = 0
while True:
    test = test - 1
    if test == 5:
        break
import time

tCurrent = time.time()

while True:
    if time.time() >= tCurrent + 1:
        print "Time = %d" % time.time()
        tCurrent = time.time()

这是一个巨大的CPU使用量做基本上没有工作。此代码对系统的其余部分更为友好:

import time

tCurrent = time.time()

while True:
    time.sleep(0.25) # sleep for 250 milliseconds
    if time.time() >= tCurrent + 1:
        print "Time = %d" % time.time()
        tCurrent = time.time()
输出相同:

Time = 1498226796
Time = 1498226797
Time = 1498226798
Time = 1498226799
而且CPU使用率非常低:


我想分享我正在使用的:

import time
# provide a waiting-time list:
lst = [1,2,7,4,5,6,4,3]
# set the timeout limit
timeLimit = 4

for i in lst:
    timeCheck = time.time()
    while True:
        time.sleep(i)
        if time.time() <= timeCheck + timeLimit:
            print ([i,'looks ok'])
            break
        else:
            print ([i,'too long'])
            break

我读过这篇文章,但我只是想问一些问题,难道我根本就没有写过这样的作品吗? 我已经做了5、10和20秒的测试。它的时间并不精确,但它们非常接近实际值

import time

begin_time=0
while begin_time<5:

    begin_time+=1
    time.sleep(1.0)
print("The Work is Done")
导入时间
开始时间=0

在我看来,这个解决方案应该是公认的答案。它的性能要好得多,也就是说,在给定的时间段内,循环中执行的代码要多得多。如果没有睡眠调用,这难道不会导致CPU在循环中旋转吗?@Anthony在这个特定的示例中是的,直到超时开始并停止它。这只是一个演示如何使用此特定模块停止循环的示例。为什么此引发RuntimeError异常的解决方案优于while cycle中的适当条件?这在Windows上不起作用,因为Windows未实现SIGALRM。我使用
timeit.default\u timer
,它始终是平台最精确的时钟。特别是,
time.time
在Windows上只有1/60秒的粒度,如果超时时间很短,这可能不够。在Python3上,还有
time.monotonic
time.perf_counter
time.process_-time
,它们可能更好(我没有过多地处理它们)。此解决方案中有太多的条件需要处理。应对此进行优化,并将
while True
替换为
while time.time()
。请看下面的第二个解决方案。@Andrew Clark,您好,先生,我只是想问一下。中断后是否可以继续while循环?如果可能的话怎么办?Th
import time

begin_time=0
while begin_time<5:

    begin_time+=1
    time.sleep(1.0)
print("The Work is Done")