6

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

我知道突然杀死一个线程不是最好的方法(相关链接),但我不知道如何中断等待 raw_input 的新线程

4

2 回答 2

6

看起来没有办法计时用户输入。在 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
于 2012-08-24T16:36:51.880 回答
1

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

在 python 和任何语言中,突然终止线程通常是一种不好的模式。考虑以下情况:

  • 线程持有必须正确关闭的关键资源。
  • 该线程创建了几个其他线程,这些线程也必须被杀死。

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

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

于 2012-08-22T18:33:42.777 回答