有没有一种方法可以同时监听多个Python套接字?

11

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

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

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个回答

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

谢谢,那个完美地解决了问题。这个例子也非常有帮助:http://www.ibm.com/developerworks/linux/tutorials/l-pysocks/section4.html - Calum
很高兴能够帮助到您 :) - entropy
socks是如何定义的?您能否完成这个例子? - mercury
如何知道它来自哪个端口? - mercury

3
Python 3 的 entropy 的回答略有更新: selectors 模块建立在 select 模块原语之上,允许高级和高效的 I/O 多路复用。鼓励用户使用此模块,除非他们需要对操作系统级别的原语进行精确控制。 根据 文档

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接