有没有办法同时监听多个Python套接字?

11 投票
2 回答
14872 浏览
提问于 2025-04-17 17:15

我可以同时监听多个套接字吗?

我现在用来监控套接字的代码是:

while True:
    for sock in socks:
        data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
        print "received message:", data

但是它会在这行停下来:

data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes

直到收到一条消息。

有没有办法让它同时监听多个套接字呢?

补充说明:不确定这是否完全相关,但我使用的是UDP。

2 个回答

3

entropy在Python 3中的回答做了稍微的更新:selectors模块可以高效地处理输入输出的多路复用,它是建立在select模块的基础上的。建议用户使用这个模块,除非他们想要对操作系统级别的基本操作有更精确的控制。具体内容可以参考文档

15

是的,确实有办法。你需要使用非阻塞调用来接收来自套接字的数据。可以看看这个select模块

如果你要从套接字读取数据,下面是使用的方法:

while True:
    # this will block until at least one socket is ready
    ready_socks,_,_ = select.select(socks, [], []) 
    for sock in ready_socks:
        data, addr = sock.recvfrom(1024) # This is will not block
        print "received message:", data

注意:你还可以给select.select()传一个额外的参数,这个参数是超时时间。如果没有套接字准备好,这样可以避免一直卡在那儿。

撰写回答