当前位置: 首页 > news >正文

50、【Ubuntu】【Gitlab】拉出内网 Web 服务:http.server 单/多线程分析(二) - 教程

【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除

背景

上篇 blog
【Ubuntu】【Gitlab】拉出内网 Web 服务:http.server 单/多线程分析(一)
分析了 Python http.server 模块默认启用的是多线程模型,并对单线程启动做了测试,下面继续

Python http.server 单/多线程分析

首先是之前 blog 提到,启动了 slow_server.py 之后,在终端输入

time curl http://localhost:2027/a

去查询该 Web 服务的响应时间如下
在这里插入图片描述
可以看到需要 10s 的时间 Web 服务才能响应,这和 SlowHandler 里面定义的 10s 休眠时间是一样的
在这里插入图片描述
这里的一个小技巧是,访问 \a 这样一个不存在的页面,只返回一个 404 错误码,不然 curl 返回的内容可就太多了

然后再接着做一个测试,在输入 time curl http://localhost:2027/a 的同时,在另一个终端再输入 time curl http://localhost:2027/b,模拟并发访问的情况

可以看到,访问 \a 页面的等待时间依旧是 10s(因为是先点开访问的)
在这里插入图片描述
而后点开访问 \b 页面的等待时间则来到了 18s(不是 10s)
在这里插入图片描述
这就足以说明,\a 页面访问的处理,阻塞了 \b 页面访问的处理,这就是上篇 blog 里提到的 HTTPServer 继承了 TCPServer 默认的单线程同步处理能力

再来看下,如果是多线程启动,修改 slow_handler.py 如下

#!/usr/bin/env python3
from http.server import ThreadingHTTPServer, SimpleHTTPRequestHandler
import time
class SlowHandler(SimpleHTTPRequestHandler):
def do_GET(self):
print(f"Handling {self.path} ... (will sleep 10s)")
time.sleep(10)  # 模拟耗时操作
"""Serve a GET request."""
f = self.send_head()
if f:
try:
self.copyfile(f, self.wfile)
finally:
f.close()
server = ThreadingHTTPServer(('localhost', 2028), SlowHandler)
server.serve_forever()

其实就是把 HTTPServer 给换成 ThreadingHTTPServer,然后端口换一下
在这里插入图片描述

其他地方不变,再次运行 slow_handler.py,然后在两个终端分别输入 time curl http://localhost:2028/atime curl http://localhost:2028/b 同时访问两个页面

可以看到,访问 \a 页面的时间是 10s(先访问)

在这里插入图片描述

而访问 \b 页面的时间也同样是 10s(后访问)

在这里插入图片描述

可以看到,在多线程下,出现并发操作同时访问,两者的时间基本一致,因为访问 \b 页面时会新开一个线程进行处理,而不用等待 \a 页面访问结束

OK,再说一个有意思的点,上篇 blog 里提到,当前的 Python 版本为 v3.12.3,此时默认的是启动多线程 Web 访问,http.server 作为 Python 里的标准库模块,其源码在 CPython 仓库中
GitHub 地址:https://github.com/python/cpython/blob/main/Lib/http/server.py

国内访问 GitHub 比较慢,可以参考下 Gitee 的同步镜像仓库(Gitee 官方维护,自动同步 GitHub 仓库的镜像,更新及时,可信度高
Gitee 地址:https://gitee.com/mirrors/cpython/
在这里插入图片描述

点击标签
在这里插入图片描述
找到 v3.6.15 版本(21年9月),这是 v3.6 的最后一个版本

在这里插入图片描述
可以看到这个时候,http.server 模块默认启动的,还是单线程 Web 服务
在这里插入图片描述
而到了 v3.7.0 版本时(v3.7 的第一个版本)
在这里插入图片描述

http.server 模块被改成了默认多线程启动
在这里插入图片描述
所以 python -m http.serverPython < v3.7 时无法并发处理请求,只有等一个请求处理完,才能轮到下一个,所以只要有一个请求慢(比如大文件下载、time.sleep),整个服务器对外表现就是卡住了,用户体验不好,所以这里 Python 3.7 是一个分水岭,官方为了提升开发体验,把命令行服务器升级为多线程


OK,本篇先到这里,如有疑问,欢迎评论区留言讨论,祝各位功力大涨,技术更上一层楼!!!更多内容见下篇 blog
【Ubuntu】【Gitlab】拉出内网 Web 服务:http.server 单/多线程分析(三)

http://www.jsqmd.com/news/262260/

相关文章:

  • 梁文峰去年进账50亿,DeepSeek粮草充足
  • vue3+python+django的人力资源数据分析设计与实现 企业员工培训考勤薪资系统
  • 2026年目前专业的PERT二型保温管制造厂家怎么选,PPR铝合金衬塑复合管,PERT二型保温管加工厂口碑推荐榜单 - 品牌推荐师
  • ACPI!RestartCtxtPassive函数对节点ACAD处理完返回DPC继续处理下一个有_STA方法的节点SLPB
  • vue3+python+django的日本旅游攻略系统
  • 广东地区飞旋镜子加工中心详细介绍,功能亮点与适用场景全解析 - 工业品牌热点
  • vue3+python+django的高效交互式在线教育平台的设计与实现
  • 牙齿种植必看:本地高评分牙科品牌排行,牙齿美白/牙齿冠修复/牙齿磨损严重怎么修复/牙周治疗/口腔正畸牙齿种植推荐排行榜推荐排行榜 - 品牌推荐师
  • C86 架构详解
  • 爆款实战!Vue3+Spring Boot+MySQL达成电商商品自动分类系统(含三级类目管理+规则兜底)
  • COOP、COEP、CORS 详解
  • 磁混凝制造企业如何选择,江苏、广东等地哪家更靠谱? - 工业品牌热点
  • 救命神器!8款AI论文软件测评:专科生毕业论文救星
  • vue3+python django框架的青岛工学院线上文献阅览平台
  • 2026 年 1 月油桶烘箱厂家推荐排行榜,高温油桶烘箱,工业油桶烘箱,油桶烘箱加热原理,高效节能烘烤设备公司推荐 - 企业推荐官【官方】
  • 深入 Python 对象模型:PyObject 与 PyVarObject 全解析
  • vue3+python+django和Vue3的体育馆场地预约管理系统的设计与实现
  • 超越“调用.fit()”:深度解析 Scikit-learn API 的设计哲学与高级范式
  • 《挑战 json.dumps:手写一个比它快 5 倍的 JSON 序列化器》
  • 安卓android广城理校园电动车租赁系统移动应用程序的开题
  • Matlab p文件 转换为m文件MATLAB matlab pcode,matlab p m...
  • “熟人”私信藏杀机:LinkedIn钓鱼直击财务高管,企业社交平台成安全盲区
  • 当LabVIEW遇上Halcon:手把手玩转语义分割
  • 聊聊上海诚信的婚恋机构,绿洲婚介所靠谱吗? - 工业品牌热点
  • 2025年德阳高中复读学校权威排名发布,中学/实验中学/学校/高中复读学校/高中/实验学校/名办高中高中复读学校品牌怎么样 - 品牌推荐师
  • AI语音克隆掀起“声”命危机:全球Vishing攻击激增,传统身份核验体系告急
  • 钓鱼新变种:攻击者借Cloudflare Pages与Zendesk“合法外衣”伪造客服门户,企业凭证安全防线告急
  • 2026年西安有实力的全屋定制实力厂家排行榜单,床/油工/小红砖/小青瓦/全屋定制/旧房改造,全屋定制公司口碑推荐榜 - 品牌推荐师
  • 伪装成“对账单”的远控木马:Coinbase钓鱼新套路暴露Windows端点安全盲区
  • 2026年1月蒸汽防爆烘箱厂家推荐排行榜,大型蒸汽防爆烘箱,高温蒸汽防爆烘箱,苏州蒸汽防爆烘箱,蒸汽防爆烘箱价格参数深度解析与选购指南 - 企业推荐官【官方】