有没有办法一次监听多个python套接字

时间:2013-02-26 23:15:11

标签: python sockets

我可以一次听多个套接字

我目前用于监控套接字的代码是:

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 个答案:

答案 0 :(得分:12)

是的,有。您需要使用非阻塞调用来从套接字接收。查看select module

如果您正在阅读插座,请按照以下方式使用它:

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()传递额外的参数,这是一个超时。如果没有套接字准备就绪,这将使它永远不会阻塞。

答案 1 :(得分:0)

entropy对于Python 3的答案进行了小幅更新: selectors模块允许在选择模块原语的基础上进行高层且高效的I / O复用。鼓励用户改用此模块,除非他们希望对所使用的OS级原语进行精确控制。 按照documentation