【问题标题】:While loop that asks for input and breaks once time is up要求输入并在时间到时中断的while循环
【发布时间】:2019-09-25 16:31:44
【问题描述】:

我想创建一个 while 循环,它能够继续接收输入,但一旦计时器倒计时到 0 就会中断。我该怎么做?

当真时: x = raw_input("在此处输入内容:")

一旦计时器达到零,无论用户是否输入任何内容,此循环都会结束。但是,我不知道如何实现这样的计时器

【问题讨论】:

  • 定时器是什么意思?
  • 循环持续的计时器,例如10 秒

标签: python while-loop timer


【解决方案1】:

我之前做过类似的事情,当我分配的时间用完时,我使用signal 触发错误,基本上是TimeOutError。我把它作为一个函数包装器,我可以方便地将它用作@timeout(seconds=<number_of_seconds>)。请看下面的代码:

import signal
from functools import wraps


class TimeOutError(Exception):
    pass


def timeout(seconds):
    def decorator(func):
        def _handle_timeout(signum, frame):
            raise TimeOutError()

        def wrapper(*args, **kwargs):
            signal.signal(signal.SIGALRM, _handle_timeout)
            signal.alarm(seconds)
            try:
                result = func(*args, **kwargs)
            finally:
                signal.alarm(0)
            return result

        return wraps(func)(wrapper)

    return decorator

# Using it as a function wrapper    
@timeout(seconds=10)
def run():
    while True: x = raw_input("Enter Stuff here:")


# Then calling it as such
try:
    run()
except TimeOutError:
    print("You have exceeded the allotted time!")

【讨论】:

  • 嘿,谢谢,信号模块在windows,python 2.7中可用吗?
  • @Mashumaro Python 2.7 将在 3 个月后退役!
  • @Mashumaro 是的,应该可以在 python2.7 中使用,但我同意你最好开始使用 python 3.x 来代替
  • 嗯显然信号不适用于 Windows 吗? :\
【解决方案2】:
import sys
import threading
import time
import queue

def add_input(input_queue):
    while True:
        input_queue.put(sys.stdin.read(1))


def timed_input():
    s = ""
    input_queue = queue.Queue()
    input_thread = threading.Thread(target=add_input, args=(input_queue,))
    input_thread.daemon = True
    input_thread.start()

    last_update = time.time()

    print("Enter stuff here and confirm with enter:")

    while True:
        # Do while countdown of 5 seconds
        if time.time()-last_update > 5:
            print("\nTime is up")
            s = s.replace("\n", "")
            if s != "":
                print(s, " entered.")
            break

        if not input_queue.empty():
            s += input_queue.get()

timed_input()

【讨论】:

    【解决方案3】:

    你可以使用multiprocessing.Process来做到这一点

    from time import sleep
    from os.path import isfile
    from os import remove
    
    def timeout():
        t_start = time()
        while True:
            if time() - t_start > 3:
                with open('spy', 'w') as source:
                    source.write('emm')
                break
            else:
                sleep(1.)
    p1 = Process(target=timeout, daemon=True)
    p1.start()
    
    while True:
        if not isfile('spy'):
            a = input('input something:')
        else:
            remove('spy')
            p1.join()
            break
    

    但是,正如您从脚本中看到的那样,一个问题是,除非用户键入要调用 if not isfile('spy') 的内容,否则此脚本不会退出。

    【讨论】:

    • 嗯,我想我的问题的措辞很糟糕,我的意思是 while 循环将在中断前持续 10 秒。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 2013-10-05
    • 2020-08-05
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多