在单独的线程中等待用户输入


问题内容

我正在尝试完成一种产生等待用户输入的线程的方法。如果在10秒内未输入任何输入,我希望脚本杀死生成的线程并继续处理。如果输入了文本,我有办法从线程取回输入,但是我没有办法让超时终止新产生的线程。

在下面的示例中,我是最接近的。我告诉新创建的线程,它是一个守护进程,它将在主脚本退出时退出。我的问题是线程将继续等待,直到脚本退出或用户输入了内容。

shared_var = ['1']
def run(ref):
    ref[0] = raw_input("enter something: ")
    print "shared var changed to '%s'" % (ref[0])

thread = threading.Thread(target=run, args=(shared_var,))
thread.daemon = True  
thread.start()
time.sleep(10)  # simplified timeout

#Need some way to stop thread if no input has been entered
print "shared var = " + shared_var[0]

我知道突然杀死线程不是最好的方法(Related Link),但是我不知道如何中断在raw_input上等待的新线程


问题答案:

似乎无法计时用户输入。在SmartElectron提供的链接中,该解决方案不起作用,因为一旦请求raw_input,计时器就会暂停。

迄今为止最好的解决方案是:

# Declare a mutable object so that it can be pass via reference
user_input = [None]

# spawn a new thread to wait for input 
def get_user_input(user_input_ref):
    user_input_ref[0] = raw_input("Give me some Information: ")

mythread = threading.Thread(target=get_user_input, args=(user_input,))
mythread.daemon = True
mythread.start()

for increment in range(1, 10):
    time.sleep(1)
    if user_input[0] is not None:
        break