因为套接字工作,python中如何实现键盘非阻塞读取
我正在用Python编写一个客户端-服务器程序,运行时客户端每秒都会发送一个保持连接的包。
我需要客户端能够从键盘读取一个动作,以便发送一个特殊的包到服务器,但在读取的时候,我不能停止发送保持连接的包。如果按照常规方式读取,就会阻塞,导致保持连接的包发送停止。
理想的情况是,在保持连接的同时可以在控制台输入内容,当按下“回车”键时处理这些文本。
有没有什么好的主意呢?
谢谢!
3 个回答
0
在Unix系统中,还有一种方法可以读取用户输入,而不会让程序长时间停住,这就是使用闹钟(alarm):
from signal import SIGALRM, alarm, signal
class Alarm(Exception):
pass
def alarm_handler(*args):
raise Alarm
def raw_input_alarm(prompt='', timeout=None):
if timeout is None: # no timeout
return raw_input(prompt)
# set signal handler
signal(SIGALRM, alarm_handler)
alarm(timeout) # produce SIGALRM in `timeout` seconds
try:
return raw_input(prompt)
except Alarm:
return '' # timeout happened
finally:
alarm(0) # cancel alarm
示例
print(repr(raw_input_alarm(timeout=1)))
alarm
函数需要一个整数,表示秒数。如果你想设置更短的超时时间,可以看看signal.setitimer()
这个函数。
0
这基本上是一个线程问题。我建议你可以看看如何使用 Twisted 来管理你的网络连接。它可以异步工作,这样你就可以继续接收键盘输入了。
1
找到了,使用 select.select 我可以这样做,代码如下:
selectList = [sktTCP,sys.stdin]
(read, write, exc) = select.select(selectList, [], [], 0 )
希望这能帮到某个人!