在 Python 程序中提供超时 [重复]
Posted
技术标签:
【中文标题】在 Python 程序中提供超时 [重复]【英文标题】:Provide a timeout in Python program [duplicate] 【发布时间】:2019-10-12 09:26:57 【问题描述】:我正在用 python 编写一个接受两个输入的程序。
一旦用户给出第一个输入,他有 10 秒的时间给出第二个输入。 如果用户能够在这 10 秒内提供第二个值并按下回车键,则计时器停止并进入程序的下一部分。
python 中是否有任何功能允许我在 10 秒后提供中断并停止接受第二个输入。如果给出第二个输入,则停止计时器。
【问题讨论】:
您需要为此使用多线程解决方案 您可以使用timeout-decorator 来做到这一点,因为这是一个相对简单的要求。 python-idle 标签是关于 IDLE 编辑器和 shell 的,而不是“什么都不做”。无论如何,你可以通过一个简单的 tkinter 程序使用 Entry 和 .after 回调轻松地做你想做的事情。 【参考方案1】:您可以创建一个自定义的 Timer 类并在不同的线程中启动它。一旦发生超时(10 秒后),您可以将SIGINT
信号发送回父线程,这将引发我们在main()
函数中捕获的KeyboardInterrupt
异常。否则,您可以停止 Timer,在用户在正确的时间输入第二个输入后,这将停止 Timer 线程。此外,我们可以检查KeyboardInterrupt
是否由于超时或用户操作而发生。
注意:当我们将信号发送到主进程时,我们还需要检查我们在哪个平台上运行程序。见signal.CTRL_C_EVENT and signal.SIGINT。
演示:https://repl.it/repls/StandardBuoyantProtools
解决方案:
import time
import threading
import os
import signal
class Timer(threading.Thread):
_timeout = False
_timer = 0
_stopped = False
def __init__(self, delay):
super(Timer, self).__init__()
self.restart(delay)
def is_timeout(self):
return self._timeout
def stop(self):
self._stopped = True
def restart(self, delay):
self._stopped = False
self._timer = time.time() + delay
def run(self):
while not self._stopped:
time.sleep(0.1)
if time.time() >= self._timer:
break
if not self._stopped:
self._timeout = True
# check os name
if os.name == 'nt':
# we are on Windows
os.kill(os.getpid(), signal.CTRL_C_EVENT)
else:
# we are on a Posix/Unix (or very unlikely on java) system
os.kill(os.getpid(), signal.SIGINT)
def main():
first_input = input('First input:')
delay = 10
timer = Timer(delay)
timer.daemon = True
try:
print('\nStarting the timer for the second input %r second(s)' % delay)
timer.start()
second_input = input('Second input:')
print('\nWell done. Stopping the timer!\n')
timer.stop()
print('Input values: %r %r\n' % (first_input, second_input))
# do your stuff here...
except KeyboardInterrupt:
if timer.is_timeout():
print("\nTimeout!")
else:
print("\nUser interrupted the input")
main()
【讨论】:
以上是关于在 Python 程序中提供超时 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
使用 SQL Azure 从会话状态提供程序(实体框架)持续接收“超时时间已过”