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

时间:2017-06-11 06:11:50

标签: multithreading python-3.x

我想创建一个等待输入的函数,如果在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 :(得分: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)

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