非阻塞套接字编程:

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)的更多相关文章

  1. 非阻塞套接字与IO多路复用

    我们了解了socket之后已经知道,普通套接字实现的服务端的缺陷:一次只能服务一个客户端! 并且,为了使一个客户端能够不断收发消息,我们还要使用while循环来轮询,这极大地降低了我们的效率 acce ...

  2. 11 非阻塞套接字与IO多路复用(进阶)

    1.非阻塞套接字 第一部分 基本IO模型 1.普通套接字实现的服务端的缺陷 一次只能服务一个客户端! 2.普通套接字实现的服务端的瓶颈!!! accept阻塞! 在没有新的套接字来之前,不能处理已经建 ...

  3. 非阻塞套接字与IO多路复用(转,python实现版)

    非阻塞:指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回.epoll工作在非阻塞模式时,才会发挥作用. 我们了解了socket之后已经知道,普通套接字实现的服务端的缺陷:一次只能服务一个 ...

  4. python_非阻塞套接字及I/O流

    http://www.cnblogs.com/lixy-88428977/p/9638949.html 首先,我们要明确2个问题: 普通套接字实现的服务端有什么缺陷吗? 有,一次只能服务一个客户端! ...

  5. C++ 非阻塞套接字的使用 (3)

    异步非阻塞套接字避免了死循环的接收问题,但是软件用起来体验还是很差.究其原因,软件在指令的发送.接收上, 采取了一种不合理的方式:在指令的发送后,立刻调用接收函数,等待回令. 若是采用同步阻塞套接字, ...

  6. C++ 非阻塞套接字的使用 (1)

    在维护代码的过程中,发现软件运行的CPU占用率居高不下,在4核的电脑上占用了25%的CPU.查阅资料的得知,这是可能是由于软件中出现了死循环. 经过对软件的一些测试,最终确定了死循环出现的位置——通讯 ...

  7. C++ 非阻塞套接字的使用 (2)

    继续话题——软件中的异步非阻塞通讯方式. 由于软件基于MFC开发,所以实现异步通讯时使用了CAsyncSocket类. 首先要了解CAsyncSocket异步机制,引用自 http://blog.cs ...

  8. 五种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          ...

  9. python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)

    python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程 并行与并发 同步与异步 阻塞与非阻塞 CPU密集型与IO密集型 线程与进程 进 ...

随机推荐

  1. Spark任务提交jar包依赖解决方案

    转载自:http://blog.csdn.net/wzq294328238/article/details/48054525                    通常我们将Spark任务编写后打包成 ...

  2. ML: 聚类算法R包 - 模型聚类

    模型聚类 mclust::Mclust RWeka::Cobweb mclust::Mclust EM算法也称为期望最大化算法,在是使用该算法聚类时,将数据集看作一个有隐形变量的概率模型,并实现模型最 ...

  3. Docker Dockerfile 一

    1.概述 创建Docker镜像的方式有三种 docker commit命令:由容器生成镜像: Dockerfile文件+docker build命令: 从本地文件系统导入:OpenVZ的模板. 关于这 ...

  4. HelloStruts

    Hello Struts 建立项目 打开myeclipse 新建项目 选择myeclipse-java enterprise projects-web project 项目名称:hellostruts ...

  5. 关于sql 注入,感觉比较全的一篇文章

    原文链接 http://netsecurity.51cto.com/art/201705/538863.htm

  6. elasticsearch 口水篇(4)java客户端 - 原生esClient

    上一篇(elasticsearch 口水篇(3)java客户端 - Jest)Jest是第三方客户端,基于REST Api进行调用(httpClient),本篇简单介绍下elasticsearch原生 ...

  7. 网站首页多URL可访问,如何集中首页网站权重?

    原文地址:http://ask.seowhy.com/question/8573 百度站长平台Lee在文章<建立符合搜索引擎抓取习惯>一文中提出:唯一性网站中同一内容页只与唯一一个url相 ...

  8. linux安装tomcat9

    0:环境准备 :     安装tomcat需要先配置jdk,所以没有配置jdk同学,先移步Linux安装JDK 或者使用比较便捷的方法,就是apt-get或者yum安装openJDK,这样做的话,会帮 ...

  9. linux采集CPU温度并上传数据到云平台判断是否需要beep

    如果要beep肯定要apt install beep的 但光安装好还不够,需要执行模块加载 /sbin/modprobe pcspkr 再写一个bash脚本 data=$(/usr/bin/senso ...

  10. AD中组的概念