10

我可以一次听多个套接字吗

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

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

4

2 回答 2

12

就在这里。您需要使用非阻塞调用从套接字接收。查看选择模块

如果您正在从套接字读取,那么您是如何使用它的:

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()该参数是超时。如果没有套接字准备好,这将防止它永远阻塞。

于 2013-02-26T23:33:53.560 回答
1

对entropy对 Python 3 的回答的轻微更新:该selectors模块允许高级和高效的 I/O 多路复用,建立在选择模块原语的基础上。鼓励用户改用这个模块,除非他们想要精确控制所使用的操作系统级原语。根据文档

于 2020-05-10T15:27:36.363 回答