尽管有线程,为什么我们仍然坚持这个功能?

我想创建一个等待输入的函数,如果在2秒内没有输入任何内容,则跳过输入并继续执行函数的其余部分 .

我从另一个线程尝试了这个函数:

import time
from threading import Thread

answer = None

def check():
    time.sleep(2)
    if answer != None:
        return "ayy"
    print("Too slow")
    return "No input"

Thread(target = check).start()

answer = input("Input something: ")
print(answer)

此代码要求输入,如果在2秒内未添加任何输入,则打印“太慢” . 然而它永远不会继续打印(回答),我认为它一直在等待用户输入 .

我想要求用户输入,如果它需要太长时间,它只需要输入=无,然后转到它下面的函数 . 我查看了涉及信号的超时方法,但这只适用于linux和im在windows上 .

回答(1)

2 years ago

你的假设是对的 . input() 调用正在等待用户提交任何在您的情况下从未发生过的输入 .

跨平台解决方案是使用 select()

import sys
import select

def timed_input(prompt, timeout=10):
    """
    Wait ``timeout`` seconds for user input

    Returns a tuple:
        [0] -> Flag if timeout occured
        [1] -> User input
    """
    sys.stdout.write(prompt)
    sys.stdout.flush()

    input, output, error = select.select([sys.stdin], [], [], 2)

    if input:
        return True, sys.stdin.readline().strip()
    else:
        return False, None

timed_input('Input something: ', timeout=2)

那是一个肮脏的原型 . 我建议使用超时的异常或更直观的函数返回值 .