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

时间:2012-08-22 17:28:10

标签: python multithreading user-input

我正在尝试生成一种等待用户输入的线程的方法;如果在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的新线程

2 个答案:

答案 0 :(得分:3)

看起来没有办法计时用户输入。在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

答案 1 :(得分:1)

在你的情况下不要担心突然关闭线程。在链接中,说

在python和任何语言中突然杀死一个线程通常是一种糟糕的模式。想想以下情况:

  
      
  • 线程持有必须正确关闭的关键资源。
  •   
  • 线程已经创建了几个必须被杀死的其他线程。
  •   
     

关闭数据库连接,打开文件等需要的资源   正确关闭,在这种情况下正确关闭线程   基本的。在这种情况下,您的解决方案是有效的。*

如果此解决方案不满足,您可以使用How to set time limit on input