@

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()

关于作者

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 此文凝聚 ...

随机推荐

linux查找日志常用命令

1.查找文件test中目标字符串(xxxx)出现的行数位置grep -n xxxx  test 2.文件test从某一行(n)开始显示more +n  test 3.查询文件test中出现目标字符串x ...

vector容器总结.xml

1 清空所有元素     m_itemVector.clear();   2 遍历     vector::iterator iter=m_itemVector.b ...

SPI移位寄存器

spi移位寄存器即是spi的数据寄存器,在stm32中数据手册是这样描述的:

基于Node.js的实时推送 juggernaut

基于Node.js的实时推送 juggernaut Juggernaut 基于 Node.js 构建.为浏览器和服务器端提供一个实时的连接,可在客户端和服务器端进行数据的实时推送,适合多角色游戏.聊天 ...

C++输入输出缓冲区的刷新问题

当我们对文件流进行操作的时候,它们与一个streambuf 类型的缓存(buffer)联系在一起.这个缓存(buffer)实际是一块内存空间,作为流(stream)和物理文件的媒介.例如,对于一个输出 ...

exec 重定向

文件中常用的重定向: command > filename把把标准输出重定向到一个新文件中command >> filename 把把标准输出重定向到一个文件中 (追加)comman ...

hdu_1017(水水水,坑格式)

#include #include using namespace std; int main() { int T; scanf("%d ...

list.remove的使用分析

场景描述 在做需求中,有很多情况会出现 对一个list遍历并过滤掉其中特定的数据 这种场景 .但是按照平常的使用方式,发现报错了. public static void main(String[] a ...

ABP框架 配置权限、本地语言文件、左侧菜单项

1.Framework.Core>Authorization>PermissionNames.cs 这里新增权限项 namespace Framework.Authorization { ...

JavaScript 循环:如何处理 async/await

如何串行或者并行运行异步循环? 在使用循环处理异步的魔法之前,我们先来看下我们是怎么处理同步循环的. 同步循环 很久以前我写的循环是这样的: for (var i = 0; i < array. ...

uban服务器系统,Web服务器-并发服务器-Epoll(3.4.5)相关推荐

  1. 安装服务器系统大概多久,安装服务器系统

    安装服务器系统 内容精选 换一换 Atlas 800 训练服务器(型号 9010)安装上架.服务器基础参数配置.安装操作系统等操作请参见<Atlas 800 训练服务器 用户指南 (型号9010 ...

  2. 华为云更换服务器系统,华为云更换服务器系统

    华为云更换服务器系统 内容精选 换一换 华为云支持将已有的SAP ASE系统迁移到华为云上,并针对不同系统提供了相应的迁移方案.应用服务器的迁移推荐使用华为云的主机迁移服务(SMS),具体原理与操作请 ...

  3. java web 大并发服务器_计算-服务器最大并发量-http协议请求-以webSphere服务器为例-考虑线程池...

    请求的处理流程 广域网上有大量的并发用户同时访问web服务器,web服务器传递请求给应用服务器(web容器),web容器传递请求给ejb容器,然后ejb容器发送数据库连接请求给数据库. 请求的处理流程 ...

  4. i7 8700 服务器系统,i7 8700k 云服务器6

    i7 8700k 云服务器6 内容精选 换一换 简要介绍Snappy是一个C++的用来压缩和解压缩的开发包.其目标不是最大限度压缩或者兼容其他压缩格式,而是旨在提供高速压缩速度和合理的压缩率.Snap ...

  5. 服务器系统装软路由,服务器系统设置软路由

    服务器系统设置软路由 内容精选 换一换 无法正常使用Cloud-init.弹性云服务器获取Metadata的流程如图1所示:获取Metadata流程图您可以按照以下原因进行排查,如果解决完某个可能原因 ...

  6. Linux并发服务器编程之多线程并发服务器

    转载:http://blog.csdn.net/qq_29227939/article/details/53782198 上一篇文章使用fork函数实现了多进程并发服务器,但是也提到了一些问题: fo ...

  7. 如何来评测服务器性能,Web实战之:服务器性能的测量评价

    随着因特网的迅速发展和网络用户的激增,WWW服务的请求数目正在以前所未有的速度增长,这导致了许多热门站点由于负载过重而变得反应迟缓.因此,用户在购买服务器时迫切需要了解服务器的各项Web指标以及服务器 ...

  8. 服务器系统不用关机,云服务器不用了要关机吗

    云服务器不用了要关机吗 内容精选 换一换 只有当云服务器处于关机状态,才能执行启动操作.只有当云服务器处于开机状态,才能执行关机操作. 云服务器不用了要关机吗 相关内容 云服务器列表页面显示了所有已创 ...

  9. 服务器系统登录ilo,华为服务器ILO默认地址

    华为服务器ILO默认地址 内容精选 换一换 1.若希望以主席身份入会,enter_code必须传入主席密码.若希望以来宾身份入会,当会议要求来宾密码时,enter_code必须传入来宾密码,会议不要求 ...

最新文章

  1. jQuery中的.bind()、.live()和.delegate()之间区别分析
  2. oracle的shell命令,Shell实现的Oracle启动脚本分享
  3. [iOS]关于零基础学习iOS开发的学习方法总结
  4. CTFshow 命令执行 web42
  5. linux lvm添加磁盘,Linux下添加磁盘创建lvm分区
  6. wayland与linux_将Linux与Wayland一起使用? 您需要知道的 | MOS86
  7. 计算机视觉学习--计算机视觉的古老秘密系列视频
  8. ICML2021|超越SE、CBAM,中山大学开源SAM:无参Attention!
  9. Django框架简介
  10. gridview 强制过长数据进行换行
  11. 手写vue---部分实现
  12. php post不完整,如何在PHP中检查不完整的POST请求
  13. 关于SQL Server将一列的多行内容拼接成一行的问题讨论
  14. 【3D文件格式解析】.obj + .mtl
  15. ARM汇编程序——加法
  16. Springboot+netty实现Web聊天室
  17. stvd watch 实时变量查看
  18. 【Vue组件】从零开始实现一个支持插入自定义表情的评论组件
  19. 任务服务器未响应,win10任务管理器没有响应的解决方法
  20. CAN负载率为什么不能太高?

热门文章

  1. boost学习之命令行参数解析库program_options
  2. 3d激光雷达开发(旋转和位移)
  3. 嵌入式操作系统内核原理和开发(优先级的修改)
  4. 随想录(用memmove函数代替strncpy函数)
  5. seq2seq模型_用 CNN 实现 Seq2Seq 模型
  6. 计算机 教育 初中 论文范文1000字,初中作文1000字
  7. SQL Server面试集合
  8. 企业级内网环境搭建教程
  9. Kubernetes 网络原理
  10. Java杂记3—流程控制之条件 1