uban服务器系统,Web服务器-并发服务器-Epoll(3.4.5)

2023-11-11

@

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. ...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

uban服务器系统,Web服务器-并发服务器-Epoll(3.4.5) 的相关文章

  • gc 调优

    文章目录 Xloggc xxx logs xxx gc t log XX UseGCLogFileRotation XX NumberOfGCLogFiles 10 XX GCLogFileSize 20M XX PrintGCDetail
  • Node Sass does not yet support your current environment解决办法

    在启动Nodejs项目时出现以下Error Error Node Sass does not yet support your current environment Linux 64 bit with Unsupported runtim
  • Python基础概念

    什么是Python Python是什么 首先我们先来看百度百科对于Python的解释 由此可见 我们知道了python是一门编程语言 Gudio van Rossum 就是Python这门语言的祖师爷 Python发展历程简介 接下来我们来
  • Python——迭代器

    迭代器 迭代是Python最强大的功能之一 是访问集合元素的一种方式 迭代器是一个可以记住遍历的位置的对象 迭代器对象从集合的第一个元素开始访问 直到所有的元素被访问完结束 迭代器只能往前不会后退 迭代器有两个基本的方法 iter 和 ne
  • matlab pburg,现代数字信号处理——AR模型

    1 AR模型概念观 AR模型是一种线性预测 即已知N个数据 可由模型推出第N点前面或后面的数据 设推出P点 所以其本质类似于插值 其目的都是为了增加有效数据 只是AR模型是由N点递推 而插值是由两点 或少数几点 去推导多点 所以AR模型要比
  • Python内置函数filter用法小结

    filter被称为高阶函数是有道理的 filter self args kwargs Docstring filter function or None iterable gt filter object Return an iterato
  • MySQL基础篇-第18章_MySQL8其它新特性

    第18章 MySQL8其它新特性 讲师 尚硅谷 宋红康 江湖人称 康师傅 官网 http www atguigu com 1 MySQL8新特性概述 MySQL从5 7版本直接跳跃发布了8 0版本 可见这是一个令人兴奋的里程碑版本 MySQ
  • Android Studio实现智能聊天机器人

    项目目录 一 需求分析 1 业务需求分析 2 模型需求分析 3 界面需求分析 二 开发环境 三 聊天功能业务实现 1 申请机器人身份标识 2 搭建聊天界面布局 3 搭建聊天条目布局 4 封装聊天信息实体类 5 编写聊天列表适配器 6 实现智
  • C++11多线程std::thread的简单使用

    文章转载自http blog csdn net star530 article details 24186783 在cocos2dx 2 0时代 我们使用的是pthread库 是一套用户级线程库 被广泛地使用在跨平台应用上 但在cocos2
  • SQL--多表查询(多表联查,如:LEFT JOIN、LEFT JOIN、LEFT JOIN、UNION ALL等)

    1 常见多表连接的三种方式 LEFT JOIN 左连接 查询左表所有数据和右表与左表属性值相等的记录 SELECT FROM TABELONE A LEFT JOIN TABELTWO B ON A id B id RIGHT JOIN 右
  • MySQL索引和性能优化

    索引 MySql底层的数据结构主要是基于Hash 和 B Tree 如果一个B tree的树高时3的话 那么非叶子节点2层 叶子节点1层 非叶子节点 16 1024 8 6 1170 非叶子节点两层 1170个元素 如果是两层 那么元素数量
  • logback和slf4j的使用之encoder和Layout

    一 encoder介绍 1 encoder 主要工作有两个 将一个event事件转换成一组byte数组 将转换后的字节数据输出到文件中 2 encoder组件是在0 9 19版本之后才引进来的 在以前的版本中 appender是使用layo
  • 计算sinx=x-x^3/3!+x^5/5!-x^7/7!+.........

    计算sinx x x 3 3 x 5 5 x 7 7 include stdio h include stdlib h include string h include math h int main float sum t int i x
  • Driver not loaded Driver not loaded(QT打包后在别人的电脑上运行出现这个错误)解决方法

    Driver not loaded Driver not loaded QT打包后在别人的电脑上运行出现这个错误 解决方法 出现这个错误 导致的原因有很多 所以不妨先试试我找的这种解决方法 我也是试过了很多方法 这种方法也许不适合所有人的错
  • 微信小程序 live-pusher 实时音视频录制 组件

    完整微信小程序 Java后端 技术贴目录清单页面 必看 实时音视频录制 v2 9 1 起支持同层渲染 需要用户授权 scope camera scope record 暂只针对国内主体如下类目的小程序开放 需要先通过类目审核 再在小程序管理
  • HTB-Tier2- Unified

    HTB Tier2 Unified Tags Web Vulnerability Assessment Databases Injection Custom Applications Outdated Software MongoDB Ja
  • Element ‘aop:before‘ must have no character or element information item [children], because

    报错的XML配置
  • centos8用阿里云安装yum源

    Centos8用阿里云装yum源 首先ping外网 ping baidu com能通就可以开始做了 阿里云yum源设置官方文档 https developer aliyun com mirror centos spm a2c6h 13651
  • Blender几个简单建模

    吉普车 这里车窗添加了玻璃材质 看起来更真实 简易台灯 可以设置成自己喜欢的形状 颜色 酒瓶 这是还没有上色的 啤酒瓶大多数都是绿色的 一把红色的椅子 个人喜欢红色系列的 就添加了红色 以上都是简单的模型 初学者还需要继续努力

随机推荐

  • Ajax&JavaScript&css模仿百度一下模糊查询功能

    1 效果 如下图所示 我们在输入大学时 程序会到后端查询名字中包含大学的数据 并展示到前端页面 用户选择一个大学 该大学值会被赋值到input表单 同时关闭下拉表单 当页面展示的数据都不符合条件时 用户点击空白处 可关闭表单 2 前端 2
  • 微信小程序案例分享

    微信小程序 后台管理类 1 社区团购小程序 2 音乐播放器小程序 3 家具商城小程序 4 二手交易小程序 5 疫苗小程序 6 智慧停车小程序 7 读书小程序 8 美食小程序 前后端分类 管理后台类 1 企业招聘 2 客户关系管理系统 3 试
  • 敏捷开发中asp.net MVC的开发次序感受(先开发View?先开发Model?先开发Controller!)

    转载自 http blog csdn net cheny com article details 6592493 各种思路和顺序都试过 最开始时先编写Model 毕竟Model是所有一切的基础 再说没有Model Controller里边用
  • 2019年中山大学数据科学与计算机学院研究生统考机试

    2019年中山大学数据科学与计算机学院研究生统考机试题目回忆 本文回忆了2019年中山大学数据科学与计算机学院研究生考试机试题目 希望能对以后的同学的学习有所帮助 机试共十道题 1 继承 一共有3个类 animal cat dog cat和
  • ciscn 2022 misc 部分wp

    everlasting night 提示是注意png数据块 然后注意图片通道数据可以用来lsb解码 下载是一张图片 尝试几种方法之后没有太大发现 得到提示于是看了一下stegsolve f78dcd383f1b574b 这里发现了一串可疑字
  • 90、Tensorflow实现分布式学习,多台电脑,多个GPU 异步试学习

    Created on 2017年5月28日 author weizhen import time import tensorflow as tf from tensorflow examples tutorials mnist import
  • Vue 实现左边导航栏且右边显示具体内容(element-ui)

    最终效果图 现在开始进入正题 1 安装element ui npm i element ui S CDN 目前可以通过 unpkg com element ui 获取到最新版本的资源 在页面上引入 js 和 css 文件即可开始使用
  • 探索人工智能

    前言 模型训练是指使用算法和数据对机器学习模型进行参数调整和优化的过程 模型训练一般包含以下步骤 数据收集 数据预处理 模型选择 模型训练 模型评估 超参数调优 模型部署 持续优化 文章目录 前言 数据收集 数据预处理 模型选择 模型训练
  • Tracy 小笔记 Vue - 路由

    Vue Router 路由中有一个非常重要的概念叫路由表 本质上就是一个映射表 决定了数据包的指向 服务器渲染 后端渲染 如 jsp php java 服务器直接生产渲染好对应的 html 页面 返回到客户端进行展示 这种情况下渲染好的页面
  • java实现截图功能

    java实现截图功能 java实现截图 录屏 public static void main String args throws InterruptedException 截取整个屏幕 保存在H盘下 名字为当前时间毫秒值 格式为png T
  • Unity3D-UI--Layout组件

    Layout组件 自动排版 Layout Group Vertical Layout Group 垂直布局 垂直布局组 组件将其子布局元素彼此重叠 它们的高度由各自的最小高度 首选高度和柔性高度决定 具体取决于以下模型 Vertical L
  • Activity之间的跳转的两种实现方法

    概括 在Android当中 Activity的跳转有两种方法 第一个是利用startActivity Intent intent 的方法 第二个则是利用startActivityForResult Intent intent int req
  • QT添加外部动态库

    编译完动态库 将动态库debug文件夹中的 a和 dll拷贝下来 在window中 dll 动态库 lib 静态库 在linux中 so 动态库 a 静态库 在根目录下新建include 并放入其中 同样的把头文件也放入include中 然
  • 图论基本概念

    文章目录 图 相邻 度 简单图 路径 子图 连通 无向图 有向图 本章概述了图论中的一些概念 部分内容来源于 OI Wiki 图 图 Graph 是一个由 点集 Vertex set 和 边集 Edge set 组成的二元组 常用 G V
  • 哈工大深圳计算机水平怎么样,还原一个真实的哈工大!——十问(转载)

    发信人 hiticeberg 千面怪 信区 NewExpress 标 题 还原一个真实的哈工大 十问 发信站 水木社区 Fri May 30 19 37 50 2008 站内 作为哈工大的土著 也许也是目前连续在校时间最长的哈工大学子 在毕
  • [蓝桥杯][2013年第四届真题]剪格子

    一定要好好审题啊 行号和列号跟题意要求的搞反了 结果de到怀疑人生了 这个题给的数据量不大 所以我就放心大胆的在每个中间节点里各开了一个vis标记数组 用来记录每一条广搜路径走过的节点 include
  • 微信小程序使用 scss

    一 在 vscode 中安装 easy sass 扩展 二 在微信开发者工具导入 vscode 安装的 easy sass 扩展 安装完成后会让重新加载扩展 再次打开后就可以看到扩展已经有 easy sass 了 三 修改 easy sas
  • 【雕爷学编程】MicroPython手册之 WiPy 特定端口库 wipy.machine.I2C.readfrom()

    MicroPython是为了在嵌入式系统中运行Python 3编程语言而设计的轻量级版本解释器 与常规Python相比 MicroPython解释器体积小 仅100KB左右 通过编译成二进制Executable文件运行 执行效率较高 它使用
  • 用logrotate拆分nginx日志

    被遗忘的Logrotate
  • uban服务器系统,Web服务器-并发服务器-Epoll(3.4.5)

    1 介绍 epoll是一种解决方案 nginx就是用的这个 中心思想 不要再使用多进程 多线程了 使用单进程 单线程去实现并发 在上面博客实现的代码中使用过的轮询去查看套接字有没有数据 而epoll是主动通知 当使用多进程的时候 是复制一份