【问题标题】:Terminating a while loop after 2 seconds for a lengthy process within the loop在 2 秒后终止一个 while 循环,以便在循环中进行长时间的处理
【发布时间】:2014-01-17 14:08:31
【问题描述】:

我有一个 while 循环,其中包含一个每次大约需要 1 秒但偶尔需要超过 5 分钟的过程。如果发生这种 5 分钟的情况,我希望循环在 2 秒后终止。 我已经试过了

import time
t1 = time.time() + 2
while time.time() < t1:
    PerformProcess

但这种方法受到每次计算 time.time() 时 PerformProcess 自动终止这一事实的限制。

我经常看到的另一个解决方案是

import time
t1 = time.time()
t2 = time.time()
while t2 - t1 < 2:
    PerformProcess
    t2 = time.time()

但这种方法不起作用,因为如果执行 5 分钟的过程,将无法达到 t2 的刷新。

我基本上只需要一种在 2 秒后终止 while 循环的方法,以便在 while 循环内不进行时间计算和/或使时间计算不会在 while 循环内终止进程。

如果有帮助,PerformProcess 本质上是使用 urllib 打开网页并从中提取数据。它所做的事情的简化版本本质上是

import urllib
f = urllib.urlopen(str(Hyperlink))
s = f.read()
print s
f.close()

其中 f 通常需要 1 秒,但有时由于某种原因需要更长的时间。

【问题讨论】:

  • 将你的进程作为子进程/线程/某物午餐,然后运行一个计算时间的lopp并杀死它。
  • 调用time.time()不会终止PerformProcess;相反,time.time() 不会被调用 直到 PerformProcess 自行完成。
  • 你在哪个平台上?我有一个简单的解决方案,它使用 SIGALRM,但它不适用于 Windows。如果您使用的是 Windows,我有一个涉及线程的更复杂的解决方案。
  • 是的,Windows 恐怕。以前从未使用过线程,但希望看到您的解决方案!
  • 啊哈。使用urllib2 而不是urllib,那么你将有超时kwarg。

标签: python python-2.7 time while-loop


【解决方案1】:

如果我理解正确,您尝试设置的超时与 url 获取有关。我不确定您使用的是什么版本的 python,但如果您使用的是 2.6+,那么我想知道这样的事情是否可能是您想要做的:

import urllib2
f = urllib2.urlopen(str(Hyperlink), timeout=2)

然后你需要包装一个 try/except 并在超时发生时做一些事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-15
    • 2020-06-20
    相关资源
    最近更新 更多