2017-06-11 38 views
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和Windows。

回答

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) 

這是一個骯髒的原型。我建議使用超時的異常或函數的更直觀的返回值。

相關問題