zoukankan      html  css  js  c++  java
  • Python——IO多路复用之select模块epoll方法

    Python——IO多路复用之select模块epoll方法

    使用epoll方法实现IO多路复用,使用方法基本与poll方法一致,epoll效率要高于select和poll。

    .
    ├── epoll_client.py
    ├── epoll_server.py
    └── settings.py

    # settings.py
    
    HOST = 'localhost'
    PORT = 5555
    buffersize = 1024
    ADDR = HOST, PORT
    # poll_server.py
    
    from settings import *
    from select import *
    from socket import *
    
    s = socket()
    s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)  # 设置端口可立即重用
    s.bind(ADDR)
    s.listen()
    
    # 创建epoll对象
    p = epoll()
    
    # 创建地图(字典)
    fdmap = {s.fileno(): s}
    
    # 注册关注(事件)
    p.register(s, EPOLLIN | EPOLLERR)
    # EPOLLIN 对应select方法中的参数rlist         -> 等待处理的IO事件
    # EPOLLOUT 对应select方法中的参数wlist     -> 主动处理的IO事件
    # EPOLLERR 对应select方法中的参数xlist        -> 出错处理的IO事件
    
    while True:
        # 进行IO监控
        # events = [(fileno, event), ...]
        try:
            events = p.poll()
        except KeyboardInterrupt:
            print('KeyboardInterrupt: Ctrl+C to exit')
            break
    
        for fd, event in events:
            if fd == s.fileno():
                # 从地图中找到fd对应的对象
                conn, addr = fdmap[fd].accept()
                print('Connect from', addr)
                # 注册关注
                p.register(conn, EPOLLIN)
                # 添加到地图中
                fdmap[conn.fileno()] = conn
            else:
                data = fdmap[fd].recv(buffersize)
                if not data:
                    p.unregister(fd)  # 取消注册
                    fdmap[fd].close()  # 关闭套接字
                    del fdmap[fd]  # 从地图中删除
                else:
                    print(fdmap[fd].getpeername(), data.decode())
                    fdmap[fd].send(b'Roger that!')
    s.close()
    print('El Fin')        
    # client.py
    
    from socket import *
    from settings import *
    
    s = socket()
    s.connect(ADDR)
    
    while True:
        data = input('>> ')
        if not data:
            break
        s.send(data.encode())
        print(s.recv(buffersize).decode())
    
    s.close()
    Resistance is Futile!
  • 相关阅读:
    Vue- 对象语法 v-bind:class与对象语法的使用(重要)
    关于vue中$emit事件问题
    深入理解vue.js2.0指令v-for使用及索引获取
    到底vuex是什么?
    Vue.js学习系列二 —— vuex学习实践笔记(附DEMO)
    前端HTML5几种存储方式的总结
    JSON和JS对象之间的互转
    Vue2.0子父组件通信
    C#字符串和16进制转换
    C#中int32 的有效值范围
  • 原文地址:https://www.cnblogs.com/noonjuan/p/11281780.html
Copyright © 2011-2022 走看看