博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IO多路复用
阅读量:6913 次
发布时间:2019-06-27

本文共 1355 字,大约阅读时间需要 4 分钟。

IO多路复用实现并发服务器

IO多路复用技术

我们把socket交给操作系统去监控

epoll 是惰性的事件回调:惰性事件回调 是由用户进程 自己调用的,操作系统只起到 通知的作用,目前Linux上效率最高的 IO多路复用 技术。

并发服务实现:

服务端

import socketimport selectors#IO多路选择器模块,使用IO多路复用无需设置非阻塞epoll_selector = selectors.EpollSelector()#用来和epoll通信的选择器,调用epollserver = 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 sockethost = '192.168.215.128'port = 8080client = 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()

详情请见

 

转载于:https://www.cnblogs.com/Gluneko/p/9556882.html

你可能感兴趣的文章
Android学习笔记PreferenceFragment的使用
查看>>
用开源项目circular progress button实现有进度条的Button
查看>>
java基础篇---枚举详解
查看>>
UpdatePanel的用法
查看>>
Ehcache(07)——Ehcache对并发的支持
查看>>
关于Eclipse中配置产品启动的插件
查看>>
在循环中创建网页元素的问题
查看>>
ACM零散知识
查看>>
【转】Spring@Autowired注解与自动装配
查看>>
JVM学习笔记(一)------基本结构
查看>>
【Intel AF 2.1 学习笔记三】
查看>>
知名黑客组织Anonymous(匿名者)的装备库
查看>>
Mac OS中Java Servlet与Http通信
查看>>
微软职位内部推荐-Principal Software Eng Mgr
查看>>
MySQL 添加外键约束,不检查现有数据
查看>>
arduino一些内容
查看>>
Entity Framework 基础知识走马观花
查看>>
Ozmosis实现BIOS直接启动Yosemite,基本完美
查看>>
document.createElement()的用法
查看>>
使用 CSS3 实现超炫的 Loading(加载)动画效果
查看>>