如何等待任何套接字具有数据



我正在实现一个同时打开几个套接字的套接字客户端。任何套接字都可能在不同的时间有数据,我想在任何套接字有数据并且可读的时候执行代码。

我不确定如何实现这个,我在看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)

您可以使用select.select来解决您的问题:

sockets = [sock1, sock2, sock3]
while sockets:
    rlist, _, _ = select.select(sockets, [], [])
    for sock in rlist:
        do_stuff(sock)
        sockets.remove(sock)

如果您使用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()

如果您使用Python 3.4或更新版本,则在标准库中有selectors模块。它将使用系统提供的"最佳"I/O多路复用实现(select, poll, kqueue…)在文档页的末尾有一个简单的回显服务器示例https://docs.python.org/3/library/selectors.html

对于旧的Python版本,也有一个backport。

相关内容

  • 没有找到相关文章

最新更新