@

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)的更多相关文章

  1. web服务器-并发服务器2

    阅读目录 1.Web静态服务器-5-非堵塞模式 2.Web静态服务器-6-epoll 3.Web静态服务器-7-gevent版 4.知识扩展-C10K问题 一.Web静态服务器-5-非堵塞模式 单进程 ...

  2. 14_Web服务器-并发服务器

    1.服务器概述 1.硬件服务器(IBM,HP): 主机 集群 2.软件服务器(HTTPserver Django flask): 网络服务器,在后端提供网络功能逻辑处理数据处理的程序或者架构等 3.服 ...

  3. Python复习笔记(十)Http协议--Web服务器-并发服务器

    1. HTTP协议(超文本传输协议) 浏览器===>服务器发送的请求格式如下:(浏览器告诉服务器,浏览器的信息) GET / HTTP/1.1 Host: www.baidu.com Conne ...

  4. Web服务器-并发服务器-长连接(3.4.4)

    @ 目录 1.说明 2.代码 关于作者 1.说明 每次new_socket都被强制关闭,造成短连接 所提不要关闭套接字 但是不关闭的话,浏览器不知道发完没有啊 此时用到header的属性Content ...

  5. Web服务器-并发服务器-单进程单线程非堵塞方式(3.4.3)

    @ 目录 1.分析 2.代码 关于作者 1.分析 当socket去监听的时候,是堵塞的状态 通过tcp_sever_socket.setblocking(False)去设置不堵塞 当socket发现没 ...

  6. Web服务器-并发服务器-协程 (3.4.2)

    @ 目录 1.分析 2.代码 关于作者 1.分析 随着网站的用户量越来愈多,通过多进程多线程的会力不从心 使用协程可以缓解这一问题 只要使用gevent实现 2.代码 from socket impo ...

  7. Web服务器-并发服务器-多进程(3.4.1)

    @ 目录 1.优化分析 2.代码 3. 关于作者 1.优化分析 在单进程的时候,相当于 是来一个客户,派一个人去服务一下 效率低,现在使用多进程来服务 假设场景 100个人同时访问页面 单进程:一次处 ...

  8. linux学习之多高并发服务器篇(一)

    高并发服务器 高并发服务器 并发服务器开发 1.多进程并发服务器 使用多进程并发服务器时要考虑以下几点: 父最大文件描述个数(父进程中需要close关闭accept返回的新文件描述符) 系统内创建进程 ...

  9. 手把手让你实现开源企业级web高并发解决方案(lvs+heartbeat+varnish+nginx+eAccelerator+memcached)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://freeze.blog.51cto.com/1846439/677348 此文凝聚 ...

随机推荐

  1. 图像分割必备知识点 | Dice损失 理论+代码

    本文包含代码案例和讲解,建议收藏,也顺便点个赞吧.欢迎各路朋友爱好者加我的微信讨论问题:cyx645016617. 在很多关于医学图像分割的竞赛.论文和项目中,发现 Dice 系数(Dice coef ...

  2. 关于Boom 3D“夜间模式”的妙用

    Boom 3D的"夜间模式"不仅能够优化音效,减小高分贝声音的突然刺激,让你夜晚的聆听效果更加舒适,还能将音效运用到各种环境中. 下面小编就给大家讲一讲如何更好的利用Boom 3D ...

  3. 使用Camtasia给视频课件添加自动聚焦的效果

    随着现在抖音与微课市场的大火,原来可能只是因为兴趣爱好而剪辑制作了一些视频为爱发电,现在却完全可以当作一个事业来做了. 但是课件录制的时候,大部分的录制屏幕软件都是全屏或者固定屏幕大小录制的,有些小细 ...

  4. 「LOJ #6500」「雅礼集训 2018 Day2」操作

    description LOJ 6500 solution 根据常有套路,容易想到将区间差分转化为异或数组上的单点修改,即令\(b_i=a_i \ xor\ a_{i-1}\), 那么将\([l,l+ ...

  5. jQuery 根据value设置radio默认选中

    jQuery 根据value设置radio默认选中:HTML: <input type="radio" name="type" value="1 ...

  6. H5,Css小姐又作画了

    用H5和CSS3做出自己名字缩写. <html> <head> <meta charset="utf-8"> <title>name ...

  7. Kafka 内存管理类BufferPool

    基本上每个成熟的框架或者工具都有一套内存管理机制 BufferPool 是Kafka  用来管理内存的工具类         BufferPool内存管理包含2个部分,已用空间+可用空间(未申请空间+ ...

  8. win10 下安装 ubuntu 子系统的完全指北

    最近在搞 C++ 相关的东西,因为在 Linux 下开发会比较流畅舒适,而公司配的电脑都是 windows 的,之前都是在 vmware 中安装个 ubuntu 虚拟机,但这种有时候比有点卡顿.所以今 ...

  9. 冲刺随笔——Day_Nine

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 团队进行Alpha冲刺 作业正文 正文 其他参考文献 无 ...

  10. Python【集合】、【函数】、【三目运算】、【lambda】、【文件操作】

    set集合: •集合的创建; set_1 = set() #方法一 set_1 = {''} #方法二 •set是无序,不重复的集合; set_1 = {'k1','k2','k3'} set_1.a ...