因为套接字工作,python中如何实现键盘非阻塞读取

0 投票
3 回答
505 浏览
提问于 2025-04-18 03:29

我正在用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 )

希望这能帮到某个人!

撰写回答