epoll及实现http多任务(python)
1.epoll用到了文件描述符的概念:
首先,操作系统中一切皆文件
文件与文件描述符fd
文件是应用程序与系统(包括特定硬件设备)之间的桥梁,而文件描述符就是应用程序使用这个“桥梁”的接口。
socket底层也是一个文件,socket.fileno()可以获得socket的文件描述符
2.select与epoll:
select:采用轮询的方式,客户端越多效率越低;需要将fd传入内核空间,内核处理后返回
epoll:采用时间触发式,效率很高;epoll是用户空间和内核空间共用的,所以不用传fd
EPOLLIN:表示对应的文件描述符可以读
EPOLLOUT:表示对应的文件描述符可以写
EPOLLIN的触发条件:
有新连接请求
客户端发送数据
客户端正常断开连接
另外,客户端异常断开连接,没触发任何事件
3.python实现http多任务:
import select
1.创建一个epoll对象
epoll = select.epoll()2.将监听套接字对应的fd放到epoll中,并绑定事件,输入触发
epoll.register(tcp_socket.fileno(), select.EPOLLIN)3.接收epoll检测到的事件及其对应的socket文件描述符,默认堵塞,直到内核检测到数据通知程序,才会解堵塞
之前使用while True,内部设置非堵塞;所以一直在占用cpu资源;而有事件发生才执行,否则挂起,减少资源占用
返回列表[(fd,event),(fd,event) . . .],event即EPOLLIN或EPOLLOUT
list fd_event_list = epoll.poll()4.循环遍历列表,如果fd是接收客户端连接的socket,则程序调accept();如果是与客户端连接的socket,且事件是发送数据,则调recv()
因为循环中只有fd,所以需要创建字典,保存accept()得到的new_socket,之后通过键fd来取得各new_socket
fd_event_dict = dict()while True: # 用来刷新新的事件
list fd_event_list = epoll.poll()
for fd, event in fd_event_list:
if fd == tcp_socket.fileno():
new_socket, client_addr = tcp_socket.accept()
epoll.register(new_socket.fileno(), select.EPOLLIN)
# 通过字典保存socket,键为fd,值为socket
fd_event_dict[new_socket.fileno()] = new_socket
elif event == select.EPOLLIN:
# 判断已经链接的客户端是否有数据发送过来
recv_data = fd_event_dict[fd].recv(1024).decode("utf-8")
if recv_data:
# 处理数据. . .
参考:
socket 编程入门教程(一)TCP server 端:2、socket与文件描述符
epoll及实现http多任务(python)的更多相关文章
- 多任务-python实现-协程(2.1.11)
多任务-python实现-协程(2.1.11) 23/100 发布文章 qq_26624329 @ 目录 1.概念 2.迭代器 1.概念 协程与子例程一样,协程(coroutine)也是一种程序组件. ...
- IO多路复用select/poll/epoll详解以及在Python中的应用
IO multiplexing(IO多路复用) IO多路复用,有些地方称之为event driven IO(事件驱动IO). 它的好处在于单个进程可以处理多个网络IO请求.select/epoll这两 ...
- 多任务-python实现-Thread的基本使用(2.1.1)
@ 目录 1.多任务的概念 2.线程 1.多任务的概念 "多任务工作"指的是当前很普遍的工作状态,一个人同时处理多件事情,比如以下这个常见的画面:写一会报告,刷一下网页,查一下资料 ...
- 多任务-python实现-gevent(2.1.15)
@ 目录 1.说明 2.代码 关于作者 1.说明 上个博文携程实现的多任务 依然是一个进程,一个线程,只不过执行了不同的代码部分 这里使用gevent,或者greenlet 当gevent执行的时候遇 ...
- 多任务-python实现-生成器相关(2.1.13)
@ 目录 1.概念 2.创建方法 3.通过send方式来启动 1.概念 通过列表生成式,我们可以直接创建一个列表,但是,受到内存限制,列表容量肯定是有限的,而且创建一个包含100万个元素的列表,不仅占 ...
- 多任务-python实现-多进程文件拷贝器(2.1.10)
@ 目录 1.需求 2.代码 1.需求 当去拷贝一个文件夹的所有文件时,使用多任务拷贝 假如一个文件使用一个进程处理 10000个文件就额可以使用最大值为10的进程池处理(当然max取值看具体主机性能 ...
- 多任务-python实现-进程pool(2.1.9)
@ 目录 1. 概念 2.python代码实现 1. 概念 当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动 ...
- 多任务-python实现-使用队列完成进程间的通信(2.1.8)
@ 目录 1.为什么要使用队列 2.python代码实现 1.为什么要使用队列 进程之间是互相独立的,而线程能够共享全局变量 所以如果进程间想要交换数据的话 只有通过进程间的通信,比如socket.太 ...
- 多任务-python实现-进程(2.1.7)
@ 目录 1.进程是什么 2.进程的生命周期 3.Python中多进程的实现 4.进程和线程的区别 1.进程是什么 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源 ...
随机推荐
- WPF DataGrid 自定义样式 MVVM 删除 查询
看到很多小伙伴在找Dategrid样式 就分享一个 ,有不好的地方 请指出 代码部分都加了注释 需要的可以自己修改为自己需要的样式 源码已经上传 地址: https://github.com/YC ...
- IScroll Unable to preventDefault inside passive event listener due to target being treated as passive
最近两天企业微信下IScroll突然无法滚动了,特别慢,之前好好的,发现主要是有红色的Unable to preventDefault inside passive event listener du ...
- mac下安装和运行redis
第一部分:安装 第一步:直接从官网下载**.tar.gz这个包.并用tar -zxvf **.tar.gz -C 指定目录 示例命令: tar -zxvf redis-5.0.5.tar.gz ...
- 2019-11-29-WPF-测试触摸设备发送触摸按下和抬起不成对
原文:2019-11-29-WPF-测试触摸设备发送触摸按下和抬起不成对 title author date CreateTime categories WPF 测试触摸设备发送触摸按下和抬起不成对 ...
- Python——pip快速下载第三方库到指定环境
pip install Scikit-learn --target=C:/Users/Jery/PycharmProjects/play/venv/Lib/site-packages -i https ...
- Qt keyevent学习笔记
在按下一个键不放后,会发生: 1.触发keypressevent(),此时isautorepeat()返回false: 2.set isautorepeat(),使其返回值为true; 3.触发key ...
- gulp教程、gulp-less安装
gulp教程之gulp-less gulp详细入门教程 11.1.安装nodejs: 11.2.新建package.json文件:cnpm init 11.3.全局和本地安装gulp: cnpm in ...
- eclipse安装sts
- PHP上传图片基本代码示例
一.HTML代码如下: <form name="form2" method="post" action="?type=add" enc ...
- Centos7安装pip或pip3
1.使用Python2安装pip wget wget --no-check-certificate https://pypi.python.org/packages/source/p/pip/pip- ...