多线程的web服务器

之前实现的web服务器,经测试发现实际上是单线程的,每次只能处理一个请求,后一个请求必须要等前一个请求处理完后才能进入到do_*函数中。这样在访问量比较大的时候是不能满足要求的,后来请教了一下同事,告诉我说ThreadingMixIn这个类可以实现多线程处理请求。自己去试了一下,发现果然可以,而且几乎不用做任何修改,只要在声明server的类中多继承一个父类就行:
class SecureHTTPServer(ThreadingMixIn,HTTPServer):

在python源代码中ThreadingMixIn这个类是在SocketServer.py文件中,重写了process_request这个函数:    def process_request(self, request, client_address):
        """Start a new thread to process the request."""
        t = threading.Thread(target = self.process_request_thread,
                             args = (request, client_address))
        if self.daemon_threads:
            t.setDaemon (1)
        t.start()
        #added by tuochao
        t.join(10)
最后一行是我加的,实际中发现运行一段时间后会出现python程序挂掉的情况,不知道是否和线程没有释放有关。反正加了这句后,没有再出现程序挂掉的情况。
我觉得奇怪的是,这个类没有继承任何父类,那么它是怎么覆盖掉原来server类的处理方法的?去查了下python的官方文档,在SocketServer这个文件的介绍中有这样一段话:
These four classes process requests synchronously; each request must be completed before the next request can be started. This isn’t suitable if each request takes a long time to complete, because it requires a lot of computation, or because it returns a lot of data which the client is slow to process. The solution is to create a separate process or thread to handle each request; the ForkingMixIn and ThreadingMixIn mix-in classes can be used to support asynchronous behaviour.
这段话介绍了默认server类的处理机制,以及ThreadingMixIn确实可以提供多线程服务器的支持。但是没有介绍是如何做到的,源代码里也看不出来,后续再研究看看吧,不过ThreadingMixIn这个类确实好用,只要继承一下就可以多线程出来消息了。
时间: 2024-10-23 01:37:46

多线程的web服务器的相关文章

多线程静态Web服务器开发小试(java)

多线程静态Web服务器(原创)Java版本 克服内存溢出问题采用缓冲式输出 文件一:HttpWebServerOfLcl.java package com.cn.lcl; import java.io.BufferedReader; import java.io.DataInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.Input

第5章 Web服务器

1.Web服务器有不同的形式:可以在计算机系统上安装并运行通用的软件Web服务器:一台Web服务器设备:或是在少量计算机芯片上实现嵌入式Web服务器. 2.第一步--接收客户端连接 客户端请求一条到Web服务器的TCP连接时,Web服务器会建立连接,判断连接的另一端是哪个客户端,从TCP连接中将IP地址解析出来. 3.第二步--接收请求报文 连接上有数据到达时,Web服务器会从网络连接中读取数据,并将请求报文中的内容解析出来. 单线程的Web服务器以此只处理一个请求,直到其完成为止.可以采用多线

关于Web服务器的认识

马上就要毕业了,也要开始找工作了,大学写了这么多代码了,却没有好好总结一下常用的概念很是遗憾额,就通过这篇博客记录一下我最常用的一些知识好了. 说到Web服务器,有很多文章都介绍的很好,之前看到一篇非常不错的,对我帮助很大,可惜现在找不到原文了,看到博客园有人转载,我就在这里也记一下好了,在此非常感谢作者的分析,受益匪浅. 那么在说Web服务器之前,先说说线程.进程.以及并发连接数. 1.进程与线程 进程是具有一定独立功能的程序,关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一

自己动手模拟开发一个简单的Web服务器

开篇:每当我们将开发好的ASP.NET网站部署到IIS服务器中,在浏览器正常浏览页面时,可曾想过Web服务器是怎么工作的,其原理是什么?“纸上得来终觉浅,绝知此事要躬行”,于是我们自己模拟一个简单的Web服务器来体会一下. 一.请求-处理-响应模型 1.1 基本过程介绍 每一个HTTP请求都会经历三个步凑:请求-处理-响应:每当我们在浏览器中输入一个URL时都会被封装为一个HTTP请求报文发送到Web服务器,而Web服务器则接收并解析HTTP请求报文,然后针对请求进行处理(返回指定的HTML页面

apache web服务器与防盗链的设置

一.安装apache2.4.23 新版本的httpd-2.4新增以下特性: 新增模块: mod_proxy_fcgi(可提供fcgi代理) mod_ratelimit(限制用户带宽) mod_request(请求模块,对请求做过滤) mod_remoteip(匹配客户端的IP地址) 对于基于IP的访问控制做了修改,不再支持allow,deny,order机制,而是统一使用require进行 还新增以下几条新特性: 1.MPM支持在运行时装载;不过要开启这种特性,在编译安装要启用这三种功能: --

CSAPP Tiny web 服务器源码分析及搭建运行

1. Web基础 web客户端和服务器之间的交互使用的是一个基于文本的应用级协议HTTP(超文本传输协议).一个web客户端(即浏览器)打开一个到服务器的因特网连接,并且请求某些内容.服务器响应所请求的内容,然后关闭连接.浏览器读取这些内容,并把它显示在屏幕上. 对于web客户端和服务器而言,内容是与一个MIME类型相关的字节序列.常见的MIME类型: MIME类型 描述 text/html HTML页面 text/plain 无格式文本 image/gif GIF格式编码的二进制图像 imag

Web服务器开发

服务器是C/S模式的核心,最近在看网络编程的东西,参考了一些书籍,做了一个Web服务器.整体的实现分为四个部分:界面控制.服务流程的实现.HTTP协议的实现.协议的辅助实现部分. 界面控制部分 主窗体设计比较简陋, Web服务器的运行离不开HTTP协议,定义一个类CHttpProtocol,用来实现HTTP协议. class CHttpProtocol { public: HWND m_hwndDlg; SOCKET m_listenSocket; map<CString, char *> m

Socket网络编程--简单Web服务器(2)

上一小节通过阅读开源的Web服务器--tinyhttpd.大概知道了一次交互的请求信息和应答信息的具体过程.接下来我就自己简单的实现一个Web服务器. 下面这个程序只是实现一个简单的框架出来.这次先实现能够Accept客户端的请求. 简单创建web服务器 webserver.h 1 #include <iostream> 2 #include <string> 3 #include <string.h> 4 #include <stdio.h> 5 #inc

简易Web服务器实现

手痒就自己实现了一下简易的web服务器,由于只是简易的web服务器,所以并没有什么特别高深的技术含量. 1.      TCP通信(socket) 2.      IO流 3.      线程池技术 服务器架构也简单: Request类主要是实现解析URL的功能,以获取html文件的路径. Response类实现读取html文件并且向浏览器输出html文件内容. Server类整合Request类和Response类,实现线程的run方法. Test类实现线程池,同时也是服务启动类. 下图是浏览