IO多路复用
2018-09-01 05:54:20来源:博客园 阅读 ()
IO多路复用实现并发服务器
IO多路复用技术
我们把socket交给操作系统去监控
epoll 是惰性的事件回调:惰性事件回调 是由用户进程 自己调用的,操作系统只起到 通知的作用,目前Linux上效率最高的 IO多路复用 技术。
并发服务实现:
服务端
import socket import selectors#IO多路选择器模块,使用IO多路复用无需设置非阻塞 epoll_selector = selectors.EpollSelector()#用来和epoll通信的选择器,调用epoll server = socket.socket() server.bind(('0.0.0.0',8080)) server.listen(1000) def read(connection): recv_data = connection.recv(1024) if recv_data: print(recv_data) connection.send(recv_data) else: epoll_selector.unregister(connection)#数据发送完毕,取消注册无需监控 connection.close() def accept(server): connection,remote_address = server.accept() #要准备收数据 epoll_selector.register(connection,selectors.EVENT_READ,read) epoll_selector.register(server,selectors.EVENT_READ,accept)#连接过来可读的时候在server上注册事件,accept是回调函数 #事件循环(主动去问epoll哪些socket可以回调,如果有了,就回调他们) while True: event = epoll_selector.select()#查询所有已经准备好的事件,返回一个列表{{二元组列表}} for key,mask in event: callback = key.data#从key里面把回调函数拿出来 sock = key.fileobj#从key里面把我们注册的那个socket拿出来 callback(socket)#回调
客户端
import socket host = '192.168.215.128' port = 8080 client = socket.socket() client.connect((host,port)) # client.send(b'haha') msg = input('-->') client.send(msg.encode('utf-8')) recv_data = client.recv(1024) print(recv_data.decode('utf-8')) client.close()
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:五、面向对象
- IO多路复用丶基于IO多路复用+socket实现并发请求丶协程 2018-09-18
- python进程、线程、协程及IO多路复用 2018-08-21
- IO多路复用多并发服务器模板 2018-06-27
- Python学习笔记整理总结【网络编程】【线程/进程/协程/IO多 2018-06-23
- 铁乐学python_Day44_IO多路复用 2018-06-18
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash