IO多路复用

select模块

可以不使用while True 解决堵塞IO问题

  • 在Windows上,只支持套接字;在Unix上,可以使用所有文件描述符。

  • poll模型 linux 可用 操作系统可以用,监听的列表比较多,随着列表的增加,效率降低

  • epoll模型 linux可用 监听列表,需要绑定回调函数。效率比较高(selectors模块)

  • 使用select模块实现socket聊天:

import select
import socket


so = socket.socket()
so.bind(("127.0.0.1", 9999))
so.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# so.setblocking(False)
so.listen()

read_list = [so]

# print(rlist)
while True:
    rlist, wlist, xlist = select.select(read_list, [], [])
    for i in rlist:
        if i is so:
           conn, addr = i.accept()
           read_list.append(conn)
        else:  #  elif i is conn:
            ret = i.recv(1024)
            if ret == b"":
                i.close()
                read_list.remove(i)
                continue
            print(ret.decode("UTF-8"))
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容