Цикл while, который запрашивает ввод и разрывается, когда время истекло - PullRequest
1 голос
/ 25 сентября 2019

Я хочу создать цикл while, который будет продолжать получать входные данные, но будет прерывать обратный отсчет таймера до 0. Как я могу это сделать?

while True: x = raw_input («Enter Stuff here:»)

Этот цикл завершится, как только таймер достигнет нуля, независимо от того, введено ли пользователем что-либо или нет.Однако я не знаю, как реализовать такой таймер

Ответы [ 3 ]

2 голосов
/ 25 сентября 2019

Я делал нечто подобное ранее, где я использую 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!")
0 голосов
/ 25 сентября 2019
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()
0 голосов
/ 25 сентября 2019

Вы можете сделать это, используя 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').

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...