Python:epoll单线程实现HTTP服务端

实战Linux I/O多路复用:借助epoll,单线程高效管理10,000+并发连接 [TOC] 引言   在应对高并发连接的传统策略中,普遍采取为每个连接配置单独线程或进程的直接方式,管理其I/O操作。此法虽直观易行,但随业务规模扩张,线程资源需求急剧上升。相反,Linux下的I/O多路复用技术,尤其是epoll,展示了一种高效路径:单一线程即可监控成千上万的文件描述符,极大提升了资源使用效率。   I/O 多路复用的场景有很多,也比较实用。通常用法epoll线程 + 线程/协程... 阅读详情

Python里效率最高的服务端,因为借用了系统级的优先权.

严格来说不算是单线程了,借用了系统的线程,让系统去监控client_socket,但程序本身只有一个线程,所以也可以叫单线程.

如果在windows运行包含epoll模块的Python代码时遇到异常是正常的.

epoll只能在Linux使用,我也不清楚为啥windows下的Python标准库会有epoll类.

我把注释去掉,如果有需要注释,我可以把注释版放上来

import socket,re,time,select


def open_file(路径):
    try:
        client_html_data=open('python_demo/HTTP协议/'+路径,'rb')
    except Exception as  ret:    
        return '404错误 页面不存在,请重新输入地址'.encode('gbk')
    else:  
        html_read_data=client_html_data.read()
        client_html_data.close()
        return html_read_data


def service_client(client_socket,recv_data):
    print('客户端发送的请求内容:')
    print('-'*50)
    print(recv_data)
    print('-'*50)
    ret_filename_=re.search(r'\w+\.html|favicon.ico',recv_data)  
    if ret_filename_:  
        file_name=ret_filename_.group()
        file_data=open_file(file_name)  
        html_header='HTTP/1.1 200 OK\r\n'    
        html_header+='Content-length:%d\r\n\r\n'%len(file_data)  
        client_socket.send(html_header.encode('gbk'))
        client_socket.send(file_data)  
    else:  
        file_data=open_file('index.html')    
        html_header='HTTP/1.1 200 OK\r\n'    
        html_header+='Content-length:%d\r\n\r\n'%len(file_data)  
        client_socket.send(html_header.encode('gbk'))
        client_socket.send(file_data)  


def main():
    tcp_socket_sever=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    tcp_socket_sever.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)       
    tcp_socket_sever.bind(('127.0.0.1',8001))
    tcp_socket_sever.listen(128)
    tcp_socket_sever.setblocking(False)  
    print('服务端已运行---------------------------------------')
    epl=select.epoll()
    epl.register(tcp_socket_sever.fileno(),select.EPOLLIN)  
    client_socket_list=list()
    fd_event_dict=dict()
    while True:
        fd_event_list=epl.poll()
        for fd,event in fd_event_list:
            if fd == tcp_socket_sever.fileno():  
                client_socket,client_addr=tcp_socket_sever.accept()
                epl.register(client_socket.fileno(),select.EPOLLIN)
                fd_event_dict[client_socket.fileno()]=client_socket
            elif event==select.EPOLLIN:
                recv_data=fd_event_dict[fd].recv(10240).decode('gbk')
                if recv_data :  
                    service_client(fd_event_dict[fd],recv_data)  
                else:  
                    fd_event_dict[fd].close()
                    del fd_event_dict[fd]
                    epl.unregister(fd)
    tcp_socket_sever.close()  


if __name__ == '__main__':
    main()

 

epoll的应用与回调函数——单线程reactor模式实现 reactor模式也是基于epoll组件基础上利用回调函数实现的,之前文章有讲过epoll主要由三个函数来实现,分别是: epoll_creat(); epoll_wait(); epoll_ctrl(); epoll中的data,其中有一个void型的指针ptr,是为了能方便把参数传入,在epoll_wait的时候就可以返回我们需要的参数,然后通过这些参数进行判断做相应处理。 在reactor中,同样是以这三个函数作为核心,在epoll_wait等到就绪的fd时,会找到之前设定的对应的回调函数进 阅读详情

相关推荐

C/C++ HTTP服务器开发:从请求解析到高并发epoll实现

网络编程是构建互联网服务的基石,其核心在于理解客户端与服务器之间通过协议进行通信的原理。HTTP协议作为Web通信的标准,定义了请求与响应的格式。在技术实现上,服务器需要高效处理并发连接,传统多进程/多线程模型面临资源开销大的挑战,而I/O多路复用技术(如epoll)通过事件驱动机制,用单个线程监控大量连接,显著提升了并发性能。这种高并发架构对于构建高性能Web服务具有重要价值,广泛应用于网关、API服务器等场景。本文以C/C++ HTTP服务器开发为例,深入探讨了从基础请求解析、响应构建到支持动态CGI程

weixin_30600197的博客 478

3.epoll登场,单线程也可服务多用户

要想用单线程实现并发服务器,也是可行,这时就需要依靠epoll了。epoll是IO多路复用的其中一种方法,其他的还有select,poll。这里主要讲解epoll。一般情况,epoll的性能是优于select,poll很多的,epoll是只能使用在linux环境的。首先回顾下多线程并发的处理流程:主线程:调用accept()去检测客户端是否有连接请1)若是有新的客户端连接请求,就建立连接2)若是无新客户端的连接请求,就阻塞子线程:调用read()或write()函数和客户端进行收发数据。

m0_57408211的博客 1285

从零构建C++ HTTP服务器:基于Epoll的事件驱动模型与Sourcetrail代码分析

网络编程是现代软件开发的核心基础,其核心在于理解操作系统如何管理网络连接与数据传输。事件驱动模型通过I/O多路复用技术,允许单个线程高效处理大量并发连接,这是构建高性能服务器的关键原理。在C++工程实践中,实现一个HTTP服务器能深刻理解TCP/IP协议栈、HTTP/1.1规范以及非阻塞I/O编程。通过从Socket层开始,逐步实现连接管理、协议解析和请求路由,开发者可以掌握高并发服务端架构的设计精髓。例如,利用Epoll实现事件循环,结合状态机解析HTTP请求,能够构建出支持静态文件服务和动态路由的Web

culi3118的博客 419

单线程epoll服务器

【代码】单线程epoll服务器。

achanzhu的博客 293

从零构建边缘AI数据管道:K230+ESP8266的物联网实践指南

本文详细介绍了如何利用K230开发板和ESP8266模块构建高可靠性的边缘AI数据管道,特别针对智能农业监测场景。通过完整的系统架构设计、AI模型部署、低功耗通信优化和云端集成方案,为开发者提供了一套可落地的物联网实践指南,重点解决了边缘计算环境下的数据传输稳定性和能效管理问题。

j2k3l4的博客 874

Windows 10下三菱PLC控件安装报错Error Number:-119的终极解决方案(附详细步骤)

本文针对Windows 10系统安装三菱PLC控件时常见的Error Number:-119报错,提供了深度分析与终极解决方案。文章剖析了该错误源于oleaut32.dll文件版本冲突,并详细介绍了通过设置兼容性模式、手动注册DLL、直接安装MX Component以及高级系统修复等多种方法,帮助用户彻底解决此安装难题,顺利搭建PLC开发环境。

weixin_29289821的博客 340

单个 epoll + 线程池与每个线程一个 epoll 这两种架构哪个更适合大量短连接的场景?

转:https://www.zhihu.com/question/271561199/answer/374711772 问题: 不少教程上都提到线程池适合大量的网络短连接的任务场景。但我总感觉这个优势有点站不住脚(单 epoll + 线程池模型),主要考虑到两点: 线程池的实现机制使得需要引入锁管理线程调度,这个开销在 per thread per epoll 模型中是不需要的。 大量的短...

yangzai187的专栏 1065

Coursera | 离散数学概论(北大)| quiz答案

Coursera离散数学概论quiz答案Week1:数理逻辑:基本概念Week2:数理逻辑:命题逻辑及形式系统Week3:数理逻辑:谓词逻辑及形式系统Week4:集合论:集合代数   先放下Coursera上找的离散数学部分相关课程:   btw.线上学习拿证书还有很多,MOOC、edm等都可。   博主选了北京大学离散数学概论Discrete Mathematics Generality。Mooc上貌似也有,但是上课时间貌似不如Coursera灵活,Coursera时间自己调度,规定时间上完即可。目前课

小鱼干的博客 4128

python 单进程单线程长链接http server epoll实现

# author : yang.cao # date : 2020.02.07 import re import socket import select def server_client(client_socket, data): ret = None try: ret = re.match(r"[^/]*(/[^\s]*)", data.splitl...

Alien_0x0111的博客 566

08-SD卡-TF卡硬件电路设计

SD卡-TF卡硬件电路设计

weixin_66510961的博客 8264

实例讲解Simulink应用层开发CAN报文解包及CAN信号设置方法

本文通过讲解MCU CAN解包模块的模块设置、输入输出信号的设置及仿真测试验证,说明了CAN解包模块的设置方法、CAN解包模块输入输出信号的设置方法以及CAN解包模块的仿真测试及修正方法。在模型搭建过程中,建议养成一种搭建完成仿真测试验证的习惯,在模块阶段发现错误,解决错误,避免在后期模块集成之后报出大量错误,增加解决错误的工作量和难度。希望通过本文的介绍能给相关技术人员带来一些参考和帮助。

qq_43011586的博客 5683

「Python网络编程」使用单线程实现多任务/epoll模型(完)

博主前言: Python网络编程系列已经讲述了套接字编程、HTTP协议、TCP/IP协议、多线程、多进程以及协程等知识,就以这篇博客结束Python网络编程系列吧。在这篇博客中会讲述两种以单线程的方式完成多任务。 1. 单线程实现多任务 前面我们讲述以多线程、多进程以及协程的方式实现多任务,那么能否以单线程的方式实现多任务呢?答案是可行的。我们先了解一种简单的方式 —— 单线程以轮询的方式实现...

南风无休的博客 483

【OpenClaw企业级智能体实战】第32篇:政企版OpenClaw安全落地指南——奇安信55页报告深度拆解与实战

2026年Q2,OpenClaw(俗称“龙虾”)安全风险集中爆发,公安部、工信部等监管机构密集发声,23万公网暴露实例、155个高危漏洞让企业“养虾”安全压力骤增。奇安信发布的55页《政企版龙虾安全使用指南》,以“看得清、管得住、用得好”为核心,构建了“端-网-云”三层防护体系。本文深度拆解这份报告的九大安全面与三大趋势,全景扫描奇安信、腾讯、360等头部厂商安全方案,提炼企业最低安全基线与实操配置,通过金融机构虚拟案例演示落地全流程,提供从资产摸底、规范制定到工具部署的完整解决方案。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 576

python-web服务器2-创建简单的web服务端(长连接、epoll 实现)

前言​:此为python学习笔记,如有错误或争议敬请发送到邮箱 zytwell321@163.com ,万分感谢​! 1.长连接实现http服务 #!/usr/bin/env python3 # -*- coding: UTF-8 -*- # author:Torry Zhang # contact: zytwell321@163.com # datetime:2020/8/19 21:32 # software: PyCharm """ 单进程-单线程-非阻塞-长连接 """ import sock

qq_34195282的博客 436

谱方法学习笔记-下(超详细)

《谱方法学习笔记》深入介绍了傅立叶谱方法在解决偏微分方程问题中的理论和实践,提供了清晰的步骤、Matlab代码以及对一维、二维波动方程等不同问题的解析,适合对谱方法感兴趣的学习者。

图灵的猫的博客 2854

Windows下Anaconda和PyTorch深度学习环境完整安装配置教程

本文详细介绍了在Windows系统下安装配置PyTorch深度学习环境的完整流程。主要内容包括:硬件环境检查(确认GPU支持)、Anaconda环境管理系统的安装与配置、虚拟环境的创建与管理方法、以及PyTorch及其相关组件的安装指南。特别强调了版本兼容性选择策略(如CUDA版本的确定)、显卡驱动更新、使用Anaconda创建隔离的PyTorch专用环境等关键步骤。无论是使用CPU还是GPU版本,读者都能按照教程快速搭建稳定的PyTorch开发环境,为深度学习项目打下坚实基础。

FJN110的博客 975

单进程、单线程、非阻塞、长连接与epoll

长/短连接操作过程 短连接操作步骤:建立连接——数据传输——关闭连接…建立连接——数据传输——关闭连接 长连接操作步骤:建立连接——数据传输…(保持连接)…数据传输——关闭连接 单进程、单线程、长连接实现非阻塞 服务器在accept 等待客户端建立连接的时候,默认是堵塞的,我们只能为当前客户端服务结束之后才能为下一个客户端服务 如果为当前客户端服务时间较长,其他客户端就得等待很久,这会大大降...

qq_44739762的博客 481

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

python epoll 并发_[Python之路] 使用epoll实现高并发HTTP服务器

什么是epoll我们在 Python多种方式实现并发的Web Server 的最后使用单进程+单线程+非阻塞+长连接实现了一个可并发处理客户端连接的服务器。他的原理可以用以下的图来描述:解释:1.HTTP服务器是我们使用 单进程+单线程+非阻塞+长连接实现 的web服务器。2.在实现的时候,我们创建了一个存放已接受Socket连接的列表,该列表是在应用程序的内存空间中的。如图中深蓝色部分3.当有...

weixin_39744554的博客 141

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Python:web 服务器的实现(HTTP协议,多任务实现http服务器,单进程、单线程实现并发http服务器,epoll原理使用)

HTTP协议:超文本传输协议,在浏览器发送请求给服务器时,服务器会收到按照HTTP协议规定的格式的请求字符串,并且服务器对浏览器应答时也必须按照HTTP协议规定的格式进行应答 实例: ` 百度服务器所返回的数据请求: Response Headers + body ● 区分header和body的就是空一行,再没出现空一行之前全部都属于header头数据。 ● header 为规范的协议格式, body为展现给服务器展现给浏览器的内容 ...

weixin_45365220的博客 387

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

python socket epoll_在python中使用epoll

最近在编写python socket程序的时候,师弟推荐了python的epoll调用,现将学习的东西总结如下:异步socket的益处和linux epoll通常情况下,我们使用的是阻塞的socket,这个就需要一个线程(或者一个复杂的进程)去执行在每个socket上面的通信工作。主程序线程包含服务器监听套接字接受来自客户端的连接请求并一次接受一个连接,并将新创建的socket传递给一个不同的线程...

weixin_39528994的博客 366

python单线程高并发爬虫

python 单线程异步爬虫 python利用socket,selector实现单线程爬虫 # 1. epoll并不代表一定比select好 # 在并发高的情况下,连接活跃度不是很高, epoll比select # 并发性不高,同时连接很活跃, select比epoll好 # 通过非阻塞io实现http请求 # select + 回调 + 事件循环 # 并发性高 # 使用单线程 import...

weixin_43486814的博客 780

python单进程单线程多任务

非阻塞 newsocket.setblocking(False) 单进程多任务 #单进程非阻塞并发处理多任务 import socket import time tcpSocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tcpSocket.bind(("", 9898)) tcpSocket.setsockopt(socket.S...

姚军 562

python epoll 并发_Python使用epoll实现高并发服务器

一、什么是epoll我们在 Python多种方式实现并发的Web Server 的最后使用单进程+单线程+非阻塞+长连接实现了一个可并发处理客户端连接的服务器。他的原理可以用以下的图来描述:解释:1.HTTP服务器是我们使用 单进程+单线程+非阻塞+长连接实现 的web服务器。2.在实现的时候,我们创建了一个存放已接受Socket连接的列表,该列表是在应用程序的内存空间中的。如图中深蓝色部分3....

weixin_39819576的博客 550

mysql epoll_单进程-单线程-非阻塞-长链接;epoll实现http服务器;epoll的原理,MySQL(数据库)基础知识;关系型数据库yu非关系型数据库;连接认证;...

单进程-单线程-非阻塞-长链接import socketimport redef service_client(new_socket):# '''为这个客户端返回数据'''# 1.接收浏览器发送出来的请求,即HTTP请求# GET/HTTP/1.1#request_lines = request.splotlines()print ('')print ('>>>' *30)pri...

weixin_34229578的博客 266

[python复习7]长链接,短链接(使用epoll)

HTTP 1.0是短链接, 1.1转化为长链接 短链接:为了得到一个数据,三次握手服务器,服务器给了我,四次挥手结束,为了得到另外一个数据又进行此过程,为了获取一个新的数据重新建立链接 长链接:通过同一个套接字获取多个数据 上面多进程 多线程,协程都是使用短链接的形式 短链接是收少显示多少,而长链接有一个问题就客户端会不知道你给他发多少数据有没有发完,所以就会一直在等待你发送,使用Content-Lenght来规定发送过去的长度达到发送即显示的目的 单进程单线程非堵塞长链接版本: import socket

weixin_45715405的博客 564

Python-网络编程:epoll

简单说(什么是epoll) epoll(采用单进程单线程,非阻塞的高并发,不过比我们之前写的更高级),它有一个特色内存,这个内存是应用程序和kernel内核共享,对于这个内存中要监听的要判断数据是否到来的套接字所对应的文件描述符采用事件通知的方式(而不是轮训的方式)。 epoll版的http(掌握思想) ...

bluebloodye的专栏 271
上一篇: Python:线程池HTTP服务端
下一篇: Python:单线程HTTP服务端_方法封装版
include_ice
博客等级 码龄9年 307粉丝 139原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值