在整个执行时间内检查stdin上的用户输入

时间:2014-10-20 16:27:25

标签: python multithreading user-input stdin cpu-usage

我当前的python脚本侦听网络,如果有某个事件,该事件将保存到列表中。

问题是,用户也会显示事件并应对其做出反应,但没有必要立即执行,因此他会显示消息,并做出一些选择,但他也可以做​​出反应(按是或按不)稍后。根据他的选择,他也提供信息,这使他能够看到他的意思(如:事件123)。

我的问题是:如何在整个执行过程中等待他的输入?到目前为止,我的方法是在新线程中的while循环(select.select())中while(1),因此不会阻止剩余的执行过程:

while(1):
  if sys.stdin in select.select([sys.stdin], [], [], 0)[0]:
    result = parse_userinput()
    react_to_event(result)      

但是:CPU运行得非常非常高,因为线程中的无限循环会不断检查输入。

在python脚本的整个执行时间内,有没有更好的方法来检查stdin上的用户输入?

1 个答案:

答案 0 :(得分:2)

当等待在新线程中完成时,您应该使用timeout选项:

while True:
    if select.select([sys.stdin], [], [], 10)[0]:
        ...

您可以将timeout选项设置为几乎任何值,因为您不需要在此主题中执行任何其他操作,并且selectsys.stdin准备好后立即返回,因此,您可以将timeout设置为51010**9。注意(您可能已经知道这一点,但对其他人可能有用)用户确实需要按回车,然后用户的输入可以通过input(或raw_input获得在Python 2)。

在旁注中,由于您只检查一个文件/套接字,您可以使用普通的Pythonic空列表检查,并删除sys.stdin in(如上所示)。