非阻塞套接字编程, IO多路复用(epoll)
非阻塞套接字编程:
server端
import socket server = socket.socket()
server.setblocking(False)
server.bind(('', 8884))
server.listen(5) clients = [] while True:
try:
conn, addr = server.accept()
conn.setblocking(False)
except BlockingIOError:
pass
else:
print(f'用户{addr[0]},建立了连接。')
clients.append(conn)
all_conn_data = [conn for conn inn clients] # 迭代新列表,防止数据紊乱(避免在迭代对象的时候修改对象,造成数据紊乱)
for conn in all_conn_data:
try:
res = conn.recv(1024)
if res:
print(res)
else:
conn.close()
print(f'用户{addr[0]},断开了连接。')
clients.remove(conn)
except BlockingIOError:
pass
all_conn_data = clients
IO多路复用之epoll(linux上效率最高的io复用技术)机制基于linux内核 : (tornado封装了epoll,因此tornado适用于linux)

IO多路复用(epoll)
注册事件
等待事件被触发
由操作系统监控
惰性 非主动调用
代码调用
import socket
import selectors server = socket.socket()
epoll_selector = selectors.EpollSelector() server.bind(('', 8888))
server.listen(5) def server_recv(conn):
recv_data = conn.recv(1024)
if recv_data:
print(recv_data)
conn.send(recv_data)
else:
epoll_selector.unregister(conn)
conn.close() def server_conn(server):
conn, addr = server.accept()
epoll_selector.register(conn, selectors.EVENT_READ, server_recv) epoll_selector.register(server, selectors.EVENT_READ, server_conn) while True:
events = epoll_selector.select()
# print(events) #[(SelectorKey(
# fileobj=<socket.socket fd=3,
# family=AddressFamily.AF_INET,
# type=SocketKind.SOCK_STREAM,
# proto=0, laddr=('0.0.0.0', 8888)>,
# fd=3, events=1,
# data=<function server_conn at 0xb72c16ec>), 1)] for event, n in events:
file_obj = event.fileobj # 套接字
callbanck = event.data
callbanck(file_obj)
非阻塞套接字编程, IO多路复用(epoll)的更多相关文章
- 非阻塞套接字与IO多路复用
我们了解了socket之后已经知道,普通套接字实现的服务端的缺陷:一次只能服务一个客户端! 并且,为了使一个客户端能够不断收发消息,我们还要使用while循环来轮询,这极大地降低了我们的效率 acce ...
- 11 非阻塞套接字与IO多路复用(进阶)
1.非阻塞套接字 第一部分 基本IO模型 1.普通套接字实现的服务端的缺陷 一次只能服务一个客户端! 2.普通套接字实现的服务端的瓶颈!!! accept阻塞! 在没有新的套接字来之前,不能处理已经建 ...
- 非阻塞套接字与IO多路复用(转,python实现版)
非阻塞:指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回.epoll工作在非阻塞模式时,才会发挥作用. 我们了解了socket之后已经知道,普通套接字实现的服务端的缺陷:一次只能服务一个 ...
- python_非阻塞套接字及I/O流
http://www.cnblogs.com/lixy-88428977/p/9638949.html 首先,我们要明确2个问题: 普通套接字实现的服务端有什么缺陷吗? 有,一次只能服务一个客户端! ...
- C++ 非阻塞套接字的使用 (3)
异步非阻塞套接字避免了死循环的接收问题,但是软件用起来体验还是很差.究其原因,软件在指令的发送.接收上, 采取了一种不合理的方式:在指令的发送后,立刻调用接收函数,等待回令. 若是采用同步阻塞套接字, ...
- C++ 非阻塞套接字的使用 (1)
在维护代码的过程中,发现软件运行的CPU占用率居高不下,在4核的电脑上占用了25%的CPU.查阅资料的得知,这是可能是由于软件中出现了死循环. 经过对软件的一些测试,最终确定了死循环出现的位置——通讯 ...
- C++ 非阻塞套接字的使用 (2)
继续话题——软件中的异步非阻塞通讯方式. 由于软件基于MFC开发,所以实现异步通讯时使用了CAsyncSocket类. 首先要了解CAsyncSocket异步机制,引用自 http://blog.cs ...
- 五种I/O 模式——阻塞(默认IO模式),非阻塞(常用语管道),I/O多路复用(IO多路复用的应用场景),信号I/O,异步I/O
五种I/O 模式——阻塞(默认IO模式),非阻塞(常用语管道),I/O多路复用(IO多路复用的应用场景),信号I/O,异步I/O 五种I/O 模式:[1] 阻塞 I/O ...
- python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)
python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程 并行与并发 同步与异步 阻塞与非阻塞 CPU密集型与IO密集型 线程与进程 进 ...
随机推荐
- windbg 如何再内核模式调试用户空间的程序
1:使用!process 0 0 获取用户空间的所有的进程的信息 !process 0 0 **** NT ACTIVE PROCESS DUMP **** PROCESS 80a02a60 ...
- 教你用CMD命令查询域名的DNS解析记录:A,NS,MX,CNAME,TXT
1.查询域名的A记录 nslookup -qt=A qqgzs.com 当然查询A记录你直接用ping命令来ping域名也可以获得A记录. 2.查询域名的NS记录 nslookup -qt=NS qq ...
- 倚天剑ss
倚天剑ss https://my.potvpn.com/ https://trial.ssbit.win/
- 存储过程DT参数
public static void TableValuedToDB(DataTable dt, string storedProcName, string TypeName) { using (Sq ...
- java小程序(课堂作业04)
请编写一个程序,使用上述算法加密或解密用户输入的英文字串要求设计思想.程序流程图.源代码.结果截图. 1,设计思想: 先输入索要加密的字符串由于此程序比较基础所以只考虑大写字母,然后用toCharAr ...
- jQuery介绍 常用选择器
jquery现在三个版本, 1.x 2.x 3.x 都在用,越小的版本兼容性越好,ie8以下浏览器也支持,新功能不多.我们通常使用1.x 在html中,css放Head中,js放body尾部 j ...
- ASP.NET中使用JSON方便实现前台与后台的数据交换
ASP.NET中使用JSON方便实现前台与后台的数据交换 发表于2014/9/13 6:47:08 8652人阅读 分类: ASP.NET Jquery extjs 一.前台向后台请求数据 在页面加 ...
- ubuntu-docker入门到放弃(二)docker初探(基本用法及命令)
一.使用公共镜像 docker有一个开源的镜像管理系统,上面有很多常见的images,如mysql,nginx,tomcat等,可以直接根据自己的需求下载下来用,还有系统images,如redhat, ...
- 在Outlook客户端使用SSL加密,弹出安全证书警告的解决方法。
这是使用自己的域名.第三方的邮件系统是产生的问题. 如万网的邮箱系统,但在Outlook中,设置的pop3/imap/smtp的域名是你自己的域名. imap.youname.domain pop3. ...
- seo一些相关内容
PR值算法原理总体上基于下面2个前提: 1.一个网页被多次引用,则它可能是很重要的: 一个网页虽然没有被多次引用,但是被重要的网页引用,则它也可能是很重要的:一个网页的重要性被平均的传递到它所引用的网 ...