【问题标题】:How to skip to the next input if time is out in python如果python中的时间到了,如何跳到下一个输入
【发布时间】:2019-01-13 16:28:33
【问题描述】:

我有一个输入列表,例如fruits = [apple, banana, grape, strawberry, orange]

我有一个 for 循环遍历这个列表和一个函数来处理每个元素:

for f in fruits:
    mix(f)
    print "Finish mixing f"

我的问题是如果当前输入花费的时间太长,如何跳到下一个输入。例如,mix() 与苹果一起工作,但 10 分钟过去了,它没有到达打印行。如果时间到了,我希望它放弃苹果并拿起香蕉。我该怎么做?

【问题讨论】:

  • 我的问题是如果当前输入花费的时间太长,如何跳到下一个输入。 这真的是时间问题吗?或者更确切地说,我的意思是一个算法架构问题,这似乎是一个XY problem。你在mix 方法中做了什么?
  • 您标记了 python-2.7,但 print("Finish mixing f") 是 Python 3 语法。
  • @scharette 在 mix 方法中只有一行代码,我使用 python 包

标签: python python-2.7 timeout


【解决方案1】:

概括一下,你想用时间执行一些操作 限制。如果操作在达到时间限制之前完成,则所有 很好。如果没有,您希望操作被中断,并执行 传递给接下来发生的任何事情。

这表明我们要建立一个try ... except 结构,其中 经过一定时间后引发的异常。

此问题未指定平台。我无法提供代码 视窗。 This questionthis other question 似乎对 那个。

在 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)

【讨论】:

  • 我看到了一个类似的答案,但效果不太好。我会试试你的。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-20
  • 1970-01-01
  • 2021-11-16
  • 2017-09-29
  • 2018-03-20
  • 1970-01-01
相关资源
最近更新 更多