我有一个输入列表,例如fruits = [apple, banana, grape, strawberry, orange]
。
我有一个for
循环来迭代这个列表,还有一个函数来处理每个元素:
for f in fruits:
mix(f)
print "Finish mixing f"
我的问题是,如果当前输入花费的时间太长,如何跳到下一个输入。例如,mix((正在处理苹果,但10分钟过去了,它还没有到达打印行。如果时间到了,我希望它放弃苹果,转而吃香蕉。我该怎么做?
概括一点,您想用一段时间执行一些操作限度如果操作在达到时间限制之前完成,则所有很好。如果没有,则希望操作中断,并执行传给下一个。
这表明我们想要建立一个try ... except
结构在经过一定时间后引发异常。
这个问题没有指定平台。我无法提供的代码Windows。这个问题和另一个问题似乎对那个
在Unix下,我们设置了一个信号处理程序函数,该函数引发例外告诉Python在SIGALRM
信号收到;并设置一个计时器,在计时时发送该信号出来请参阅下面的示例代码。
#!/usr/bin/env python2
import signal
from time import sleep # only needed for testing
timelimit_seconds = 3 # Must be an integer
# Custom exception for the timeout
class TimeoutException(Exception):
pass
# Handler function to be called when SIGALRM is received
def sigalrm_handler(signum, frame):
# We get signal!
raise TimeoutException()
# Function that takes too long for bananas and oranges
def mix(f):
if 'n' in f:
sleep(20)
else:
sleep(0.5)
fruits = ['apple', 'banana', 'grape', 'strawberry', 'orange']
for f in fruits:
# Set up signal handler for SIGALRM, saving previous value
old_handler = signal.signal(signal.SIGALRM, sigalrm_handler)
# Start timer
signal.alarm(timelimit_seconds)
try:
mix(f)
print f, 'was mixed'
except TimeoutException:
print f, 'took too long to mix'
finally:
# Turn off timer
signal.alarm(0)
# Restore handler to previous value
signal.signal(signal.SIGALRM, old_handler)