我当前的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
上的用户输入?
答案 0 :(得分:2)
当等待在新线程中完成时,您应该使用timeout选项:
while True:
if select.select([sys.stdin], [], [], 10)[0]:
...
您可以将timeout
选项设置为几乎任何值,因为您不需要在此主题中执行任何其他操作,并且select
在sys.stdin
准备好后立即返回,因此,您可以将timeout
设置为5
,10
或10**9
。注意(您可能已经知道这一点,但对其他人可能有用)用户确实需要按回车,然后用户的输入可以通过input
(或raw_input
获得在Python 2)。
在旁注中,由于您只检查一个文件/套接字,您可以使用普通的Pythonic空列表检查,并删除sys.stdin in
(如上所示)。