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版服务器的理解(Python实现)

epoll的各个事件触发条件测试

epoll及实现http多任务(python)的更多相关文章

  1. 多任务-python实现-协程(2.1.11)

    多任务-python实现-协程(2.1.11) 23/100 发布文章 qq_26624329 @ 目录 1.概念 2.迭代器 1.概念 协程与子例程一样,协程(coroutine)也是一种程序组件. ...

  2. IO多路复用select/poll/epoll详解以及在Python中的应用

    IO multiplexing(IO多路复用) IO多路复用,有些地方称之为event driven IO(事件驱动IO). 它的好处在于单个进程可以处理多个网络IO请求.select/epoll这两 ...

  3. 多任务-python实现-Thread的基本使用(2.1.1)

    @ 目录 1.多任务的概念 2.线程 1.多任务的概念 "多任务工作"指的是当前很普遍的工作状态,一个人同时处理多件事情,比如以下这个常见的画面:写一会报告,刷一下网页,查一下资料 ...

  4. 多任务-python实现-gevent(2.1.15)

    @ 目录 1.说明 2.代码 关于作者 1.说明 上个博文携程实现的多任务 依然是一个进程,一个线程,只不过执行了不同的代码部分 这里使用gevent,或者greenlet 当gevent执行的时候遇 ...

  5. 多任务-python实现-生成器相关(2.1.13)

    @ 目录 1.概念 2.创建方法 3.通过send方式来启动 1.概念 通过列表生成式,我们可以直接创建一个列表,但是,受到内存限制,列表容量肯定是有限的,而且创建一个包含100万个元素的列表,不仅占 ...

  6. 多任务-python实现-多进程文件拷贝器(2.1.10)

    @ 目录 1.需求 2.代码 1.需求 当去拷贝一个文件夹的所有文件时,使用多任务拷贝 假如一个文件使用一个进程处理 10000个文件就额可以使用最大值为10的进程池处理(当然max取值看具体主机性能 ...

  7. 多任务-python实现-进程pool(2.1.9)

    @ 目录 1. 概念 2.python代码实现 1. 概念 当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动 ...

  8. 多任务-python实现-使用队列完成进程间的通信(2.1.8)

    @ 目录 1.为什么要使用队列 2.python代码实现 1.为什么要使用队列 进程之间是互相独立的,而线程能够共享全局变量 所以如果进程间想要交换数据的话 只有通过进程间的通信,比如socket.太 ...

  9. 多任务-python实现-进程(2.1.7)

    @ 目录 1.进程是什么 2.进程的生命周期 3.Python中多进程的实现 4.进程和线程的区别 1.进程是什么 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源 ...

随机推荐

  1. 阿里云RDS数据库备份同步到自建库方法(SHELL脚本)

    一.背景: 由于阿里云RDS生产库每天都需要备份且拷贝到自建读库,而如果使用阿里云的自动拷贝到只读实例, 费用太高, 故采用自编写同步脚本方法实现. 二.前提: 1). 已开通阿里云RDS, 且开启定 ...

  2. Skywalking总结

    步骤四,完善Agent:你会发现,你在skywalking的Web监控页面看到的项目名称并非你原有的项目名称,而是一个默认的—— Your_ApplicationName.这是因为你还没有配置.打开/ ...

  3. Java学习:常用函数接口

    常用函数接口 什么是函数式接口? 函数式接口,@FunctionalInterface,简称FI,简单的说,FI就是指仅含有一个抽象方法的接口,以@Functionalnterface标注 注意:这里 ...

  4. Flink DataStream 编程入门

    流处理是 Flink 的核心,流处理的数据集用 DataStream 表示.数据流从可以从各种各样的数据源中创建(消息队列.Socket 和 文件等),经过 DataStream 的各种 transf ...

  5. UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa1 in position 3: invalid start byte错误解决办法

    这类错误的原因是编码造成的,通常情况下都是utf-8编码,这需要变换一下,改成encoding="ISO-8859-1"即可: file = pd.read_csv("/ ...

  6. 2019-11-29-WPF-客户端开发需要知道的触摸失效问题

    原文:2019-11-29-WPF-客户端开发需要知道的触摸失效问题 title author date CreateTime categories WPF 客户端开发需要知道的触摸失效问题 lind ...

  7. pack URI

    WPF使用pack URI语法寻找资源. URI负责搜索如下位置的资源: 当前程序集 引用的程序集 相对于程序集的某个位置 应用程序的源站点 pack URI的格式:pack://机构/路径 机构指定 ...

  8. DSAPI CMD命令行进程代理

    DSAPI.文件.CMD命令行进程代理,是用来和CMD.exe或指定exe进行输出重定向的简化使用工具,可隐藏或显式地启动一个cmd.exe,并将输出流.输入流和错误流重定向至代理,通过事件触发方式与 ...

  9. html 图片滚动代码

    我自己也在用的,网页常用!分享出来 最简单易懂源码 <!--下面是向上滚动代码--> <div id=butong_net_top style=overflow:hidden;hei ...

  10. 经典SQL语句使用方法大全(自留用)

    一.基础 1.说明:创建数据库CREATE DATABASE database-name2.说明:删除数据库drop database dbname3.说明:备份sql server--- 创建 备份 ...