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 此文凝聚 ...
随机推荐
- JS你所不知的小数取整方法
先介绍几种基本方法. 1.toFixed()方法 toFixed() 方法是属于 Number 对象的方法,可以把 Number 四舍五入到指定的小数位数,括号内为小数位数,范围为0~20,为0时即取 ...
- python批量生成SQL语句
1,首先写一条能运行成功插入SQL的语句 INSERT INTO sign_guest(realname,phone,email,sign,event_id)VALUES("jack&quo ...
- C语言新手入门
include<stdio.h> int main() { //输入一个数 输出它的反序列 c int a,b=0; scanf("%d",&a);//输入一个 ...
- 网络 华为 ensp 命令
VLAN 端口有三种模式:access,hybrid,trunk. Access类型端口:只能属于1个VLAN,且该端口不打tag,一般用于连接计算机端口: Trunk类型端口:可以允许多个VLAN通 ...
- python删除list中的空list
list1 = [[], [], [], [], [], 'text', 'text2', [], 'moreText'] 如何删除空列表,以便我得到: list2 = ['text', 'text2 ...
- 【NOIP2011模拟11.1】钓鱼
钓鱼 题目 Description 我们把钓鱼的过程放在坐标系里来考虑.图中蓝色的点为船,初始时它的坐标记为(Ax,y).河深为y,河宽为x.某个时刻会从左边界或右边界游出来一条鱼(左边的往右边游,右 ...
- 老猿学5G随笔:5G的三大业务场景eMBB、URLLC、mMTC
5G的三大业务场景eMBB.URLLC.mMTC: eMBB:英文全称Enhanced Mobile Broadband,即增强移动宽带,是利用5G更好的网络覆盖及更高的传输速率来为用户提供更好的上网 ...
- PyQt(Python+Qt)学习随笔:Qt Designer中部件的windowIcon属性
windowIcon对象为部件对象的属性,但只有窗口对象有效,其他派生对象如pushButtong对象无效. 在windowIcon对象上有如下子属性设置: 这几个子属性实际上是QIcon类中继承的. ...
- PyQt(Python+Qt)学习随笔:Qt Designer中QAbstractButton派生按钮部件的checkable和checked属性
checkable属性 checkable属性确认按钮是否可以被选中,缺省情况下该值为False,即按钮是不能被选中的. 可选择的按钮按下之后,按钮不会自动弹起来,此时按钮为选中状态,当再次点击按钮时 ...
- 利用反射注册SpringCache的RedisCacheManager缓存信息
项目开发中,SpringCache是一个非常方便的工具,但是在配置信息注册时,用枚举方式可以满足遍历,但却无法应用在@Cacheable注解里,因此可以通过静态类的方式,借助反射完成缓存信息注册. 配 ...