2014-10-20 26 views
0

我当前的python脚本监听网络,并且如果有某个事件,事件将被保存到列表中。在整个执行时间检查stdin上的用户输入

事情是,用户也会显示事件并对事件做出反应,但不需要立即执行,因此他会显示消息并做出一些选择,但他也可以作出反应(按是或否)在稍后的点。有了他的选择,他还提供了信息,可以查看他意味着什么事件(如:是事件123)。

我的问题是:在整个执行过程中如何等待他的输入?我的方法,到目前为止是在一个新的线程while循环(while(1)select.select(),所以剩下的执行过程中不堵塞:

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

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

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

+3

添加一个长超时会有帮助。试试'select.select([sys.stdin],[],[],10)[0]'。 – matsjoyce 2014-10-20 16:29:41

+1

我同意@matsjoyce。如果你的循环只是在等待来自'sys.stdin'的输入而没有其他任何东西,那就让'select'超时。它将释放您的CPU,而不会对其他任何事物产生不利影响。 – dano 2014-10-20 16:39:23

回答

2

为等待在一个新的线程中完成的,你应该使用timeout选项:

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

您可以设置timeout选项是几乎任何价值,因为你不需要做任何事情都要在此线程和select只要sys.stdin准备就绪,则可以将timeout设置为51010**9。请注意(您可能已经知道这一点,但它可能对其他用户有用),用户确实需要按回车键,然后用户的输入可以通过input(或Python 2中的raw_input)获得。

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

+0

我已经知道它了,但是你得到+1和正确的答案,因为你迫使我正确阅读选择文档(实际上是超时部分)。谢啦! – user1252280 2014-10-20 18:00:55