首页 文章

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

提问于
浏览 883
1

我想创建一个等待输入的函数,如果在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 回答

  • 0

    你的假设是对的 . 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)
    

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

相关问题