【问题标题】:waiting for user input in separate thread在单独的线程中等待用户输入
【发布时间】:2012-08-22 17:28:09
【问题描述】:

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

【问题讨论】:

标签: python multithreading user-input


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-02-18
      • 2023-03-14
      • 2011-12-13
      • 1970-01-01
      • 2013-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-21
      相关资源
      最近更新 更多