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)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源 ...
随机推荐
- 转载:string、const char*、 char* 、char[]相互转换
本文转自:https://blog.csdn.net/rongrongyaofeiqi/article/details/52442169 一:转化总结形式如下: 使用时,要对源格式和目标格式进行初始化 ...
- Eureka概述
1:Eureka是什么 Eureka是Spring Cloud Netflix的一个子模块,也是核心模块之一.Eureka是一个基于REST的服务,用于定位服务,以及·实现云端中间层服务发现和故障转移 ...
- 使用docker安装gitlab,两台电脑gitlab库相互迁移
原文来自合伙呀 https://hehuoya.com/2019/09/30/gitlab-docker/ Docker for gitlab brew cask install docker do ...
- UWP 使用Launcher 启动迅雷
不得不说UWP有些地方真的不方便! 另外也要夸一下迅雷,还是蛮不错的! 代码 await Launcher.LaunchUriAsync(new Uri("magnet:?xt") ...
- 【Python3爬虫】最新的12306爬虫
一.写在前面 我在以前写过一次12306网站的爬虫,当时实现了模拟登录和查询车票,但是感觉还不太够,所以对之前的代码加以修改,还实现了一个订购车票的功能. 二.主要思路 在使用Selenium做模拟登 ...
- asp.net SQLite关于各版本的调试
最近想做一个简版的管理系统,将SQL SERVER数据库切换到SQLite数据库中,采用的是SQLite3的版本数据库. 开发工具:SV2015 UP3 数据库:SQLite3 项目整体结构图 相同的 ...
- MongoDB下载+安装+配置+错误解决方法
下载 官网下载: https://www.mongodb.com/download-center/community Server=>Download 安装 下载完成后安装 建议下载根目录(下过 ...
- DevExpress的下拉框控件LookUpEdit的使用、添加item选项值、修改默认显示值
场景 Winform控件-DevExpress18下载安装注册以及在VS中使用: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1 ...
- eclipse 标记任务
eclipse 标记任务 eclipse Task Tags: TODO -用来提醒该标识处的代码有待返回继续编写.更新或者添加.该标签通常在注释块的源文件顶部. FIXME -该标签用来提醒你代码中 ...
- 响应式开发 纯CSS实现隐藏菜单栏
// 将要隐藏的菜单设置 display: block; // 然后在菜单上面设置一个点击选项,如“菜单”<label for="toggle-checkbox" id=&q ...