Web服务器-并发服务器-Epoll(3.4.5)
@
1.介绍
epoll是一种解决方案,nginx就是用的这个
中心思想:不要再使用多进程,多线程了,使用单进程,单线程去实现并发
在上面博客实现的代码中使用过的轮询去查看套接字有没有数据,而epoll是主动通知
当使用多进程的时候,是复制一份资源去查看,epoll不用复制,直接来
优势:1.共享内存 2.事件通知
2.代码
import socket
import select
def tcp_server(new_tcp_socket, request):
request_lines = request.splitlines()
print(request_lines)
print(">" * 30)
try:
file = open("./test/login.html", "rb")
except:
# 构造响应头
response_header = "HTTP/1.1 404 NOT FOUND\r\n"
response_header += "\r\n"
response_header += "----file not found-----"
new_tcp_socket.send(response_header.encode("utf-8"))
else:
html_content = file.read()
file.close()
response_body = html_content
response_header = "HTTP/1.1 200 OK\r\n"
# 使用Content-Length实现长连接
response_header += "Content-Length:%d\r\n" % len(response_body)
response_header += "\r\n"
response = response_header.encode("utf-8") + response_body
# 发送响应数据
new_tcp_socket.send(response)
def main():
"""对大致流程进行控制"""
# 1.创建tcp套接字
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置当服务器先close()即服务器4次挥手之后资源立即释放
tcp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 2.绑定端口
tcp_socket.bind(("", 7890))
# 3.监听套接字
tcp_socket.listen(128)
tcp_socket.setblocking(False)
# 创建一个epoll对象
epoll = select.epoll()
# 将监听套接字对应的fd注册到epoll中,并绑定事件 fd:文件描述符
epoll.register(tcp_socket.fileno(), select.EPOLLIN)
# 定义保存socket的字典
fd_event_dict = dict()
while True:
# 默认堵塞,直到OS检测到数据到来通过事件通知方式告诉程序,才会解堵塞 返回list
fd_event_list = epoll.poll()
# [(fd,event)] (套接字对应的文件描述符,这个文件描述符对应的到底是什么事件,例如可以调用recv接收等)
# 遍历元组
for fd, event in fd_event_list:
if fd == tcp_socket.fileno():
new_tcp_socket, client_addr = tcp_socket.accept()
epoll.register(new_tcp_socket.fileno(), select.EPOLLIN)
# 通过字典保存socket,键为fd,值为socket
fd_event_dict[new_tcp_socket.fileno()] = new_tcp_socket
elif event == select.EPOLLIN:
# 判断已经链接的客户端是否有数据发送过来
recv_data = fd_event_dict[fd].recv(1024).decode("utf-8")
if recv_data:
# 有数据操作
# 4.为这个客户端服务
tcp_server(fd_event_dict[fd], recv_data)
else:
# 无数据操作
fd_event_dict[fd].close()
epoll.unregister(fd)
del fd_event_dict[fd]
# 关闭监听套接字
tcp_socket.close()
if __name__ == '__main__':
main()
关于作者
个人博客网站
个人GitHub地址
个人公众号:
Web服务器-并发服务器-Epoll(3.4.5)的更多相关文章
- web服务器-并发服务器2
阅读目录 1.Web静态服务器-5-非堵塞模式 2.Web静态服务器-6-epoll 3.Web静态服务器-7-gevent版 4.知识扩展-C10K问题 一.Web静态服务器-5-非堵塞模式 单进程 ...
- 14_Web服务器-并发服务器
1.服务器概述 1.硬件服务器(IBM,HP): 主机 集群 2.软件服务器(HTTPserver Django flask): 网络服务器,在后端提供网络功能逻辑处理数据处理的程序或者架构等 3.服 ...
- Python复习笔记(十)Http协议--Web服务器-并发服务器
1. HTTP协议(超文本传输协议) 浏览器===>服务器发送的请求格式如下:(浏览器告诉服务器,浏览器的信息) GET / HTTP/1.1 Host: www.baidu.com Conne ...
- Web服务器-并发服务器-长连接(3.4.4)
@ 目录 1.说明 2.代码 关于作者 1.说明 每次new_socket都被强制关闭,造成短连接 所提不要关闭套接字 但是不关闭的话,浏览器不知道发完没有啊 此时用到header的属性Content ...
- Web服务器-并发服务器-单进程单线程非堵塞方式(3.4.3)
@ 目录 1.分析 2.代码 关于作者 1.分析 当socket去监听的时候,是堵塞的状态 通过tcp_sever_socket.setblocking(False)去设置不堵塞 当socket发现没 ...
- Web服务器-并发服务器-协程 (3.4.2)
@ 目录 1.分析 2.代码 关于作者 1.分析 随着网站的用户量越来愈多,通过多进程多线程的会力不从心 使用协程可以缓解这一问题 只要使用gevent实现 2.代码 from socket impo ...
- Web服务器-并发服务器-多进程(3.4.1)
@ 目录 1.优化分析 2.代码 3. 关于作者 1.优化分析 在单进程的时候,相当于 是来一个客户,派一个人去服务一下 效率低,现在使用多进程来服务 假设场景 100个人同时访问页面 单进程:一次处 ...
- linux学习之多高并发服务器篇(一)
高并发服务器 高并发服务器 并发服务器开发 1.多进程并发服务器 使用多进程并发服务器时要考虑以下几点: 父最大文件描述个数(父进程中需要close关闭accept返回的新文件描述符) 系统内创建进程 ...
- 手把手让你实现开源企业级web高并发解决方案(lvs+heartbeat+varnish+nginx+eAccelerator+memcached)
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://freeze.blog.51cto.com/1846439/677348 此文凝聚 ...
随机推荐
- CorelDRAW复制及镜面反转对象
复制的设计都是由简单的图案和基础的操作堆砌而成的,如何恰当地使用这些基础操作,就是各位新学者要格外注意的地方. 这次我们介绍CorelDRAW中的复制和镜面操作. 一.复制 1.复制单个对象 使用Co ...
- FL Studio通道乐器设置页详讲
上一篇文章我们说到FL Studio通道乐器设置页每个标签页面中几乎都是由包络.低频振荡器和滤波器这三个部分组成.我们之前只对包络进行的简单的介绍,相信很多同学对它还有其他两个的功能的了解还是云里雾里 ...
- Mac电脑数据被误删了怎么办,还能恢复吗
随着苹果产品的使用率越来越高,苹果电脑视频丢失的风险也是居高不下,大部分情况下都是由于误操作或者是中病毒导致视频丢失,苹果电脑视频恢复可以实现吗?涉及到文件恢复的问题,找EasyRecovery文件恢 ...
- JUC并发工具包之Semaphore
目录 Semaphore (JDK) Timed Semaphore (Apache Commons) Semaphore vs. Mutex CodeRepo Semaphore (JDK) 我们使 ...
- python selenium 时间搜索框查询和日期大小比较
在做selenium自动化的时候遇到 时间搜索框查询(如下图)并比较查询结果是否在输入的时间之类. 首先,第一步要做的就是选择时间,并获取到所选时间的文本信息 如上图所示,获取到的时间搜索框并没有文本 ...
- 推荐系统实践 0x07 基于邻域的算法(2)
基于邻域的算法(2) 上一篇我们讲了基于用户的协同过滤算法,基本流程就是寻找与目标用户兴趣相似的用户,按照他们对物品喜好的对目标用户进行推荐,其中哪些相似用户的评分要带上目标用户与相似用户的相似度作为 ...
- Arduion学习(一)点亮三色发光二极管
这是我接触Arduion以来第一个小实验 实验准备: 1.查阅相关资料,了解本次实验所用到的引脚.接口的相关知识. 2.准备Arduion板(本次实验所用到的型号为mega2560).三色发光二极管. ...
- Mysql命令、常用函数
一.sql命令行 查看数据库 show database : 选择使用的数据库 use 数据库名 : 查看表 show tables ; 查询表 select * from 表名 高版本my ...
- 蒲公英 · JELLY技术周刊 Vol.32: 前端的自我进化之路
蒲公英 · JELLY技术周刊 Vol.32 前端开发不过是切图仔在那儿瞎鼓捣,没啥门槛,不需要懂计算机原理,不需要懂算法,微服务.高并发这些都不需要懂,拖组件写个页面就好了,数据.逻辑.测试都可以交 ...
- java45
Collection c2 = new ArrayList(); c2.add("a"); c2.add("b"); //移除集合中的某个元素 c2.remov ...