如何等待任何套接字有数据?
How to wait for any socket to have data?
我正在实现一个同时打开多个套接字的套接字客户端。任何套接字都可能在不同的时间有数据,我想在任何套接字有数据且可读时执行代码。
我不确定如何实现它,我正在查看 select.select 但它似乎在等待所有套接字都可读。
我想避免使用多处理来处理套接字上的数据,我希望它在从每个套接字读取时是串行的,但在有可用数据时读取。
如何等待任何套接字可读?
# psudo code
sockets = [sock1, sock2, sock3]
while True:
if len(sockets) == 0:
break
for sock in sockets:
if sock.has_data():
do_stuff(sock)
sockets.remove(sock)
sleep(0.1)
如果您在 POSIX,请查看 select.poll
:
import socket
import select
p = select.poll()
s1 = socket.socket()
s2 = socket.socket()
# call connect on sockets here...
p.register(s1, select.POLLIN)
p.register(s2, select.POLLIN)
p.poll()
您可以使用 select.select
来解决您的问题:
sockets = [sock1, sock2, sock3]
while sockets:
rlist, _, _ = select.select(sockets, [], [])
for sock in rlist:
do_stuff(sock)
sockets.remove(sock)
如果您使用的是 Python 3.4 或更高版本,则标准库中有 selectors
模块。它将使用您的系统提供的 "best" I/O 多路复用实现(select、轮询、kqueue...)文档页面末尾有一个简单的回显服务器示例 https://docs.python.org/3/library/selectors.html
旧的 Python 版本也有 backport 版本。
我正在实现一个同时打开多个套接字的套接字客户端。任何套接字都可能在不同的时间有数据,我想在任何套接字有数据且可读时执行代码。
我不确定如何实现它,我正在查看 select.select 但它似乎在等待所有套接字都可读。
我想避免使用多处理来处理套接字上的数据,我希望它在从每个套接字读取时是串行的,但在有可用数据时读取。
如何等待任何套接字可读?
# psudo code
sockets = [sock1, sock2, sock3]
while True:
if len(sockets) == 0:
break
for sock in sockets:
if sock.has_data():
do_stuff(sock)
sockets.remove(sock)
sleep(0.1)
如果您在 POSIX,请查看 select.poll
:
import socket
import select
p = select.poll()
s1 = socket.socket()
s2 = socket.socket()
# call connect on sockets here...
p.register(s1, select.POLLIN)
p.register(s2, select.POLLIN)
p.poll()
您可以使用 select.select
来解决您的问题:
sockets = [sock1, sock2, sock3]
while sockets:
rlist, _, _ = select.select(sockets, [], [])
for sock in rlist:
do_stuff(sock)
sockets.remove(sock)
如果您使用的是 Python 3.4 或更高版本,则标准库中有 selectors
模块。它将使用您的系统提供的 "best" I/O 多路复用实现(select、轮询、kqueue...)文档页面末尾有一个简单的回显服务器示例 https://docs.python.org/3/library/selectors.html
旧的 Python 版本也有 backport 版本。