`
phyeas
  • 浏览: 164238 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

在Python3.0中处理web请求3-多线程

阅读更多

继续研究Python3进行处理web请求。在第一篇文章的Hello World程序中,是没有进行多线程处理的,导致的情况是当第一个人执行了一个操作,如果这个操作所需要的时间比较长,那么其他人就需要等他执行完后才能访问,这是非常不符合逻辑的,我看了下源码,HTTPServer确实没有进行任何线程处理,若运行以下代码:

#!coding=UTF-8
from http.server import HTTPServer,BaseHTTPRequestHandler
import io,shutil,time

class MyHttpHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        print(self.path)
        if self.path=='/':time.sleep(5)
        print(self.path)
        r_str="Hello World";
        enc="UTF-8"
        encoded = ''.join(r_str).encode(enc)
        f = io.BytesIO()
        f.write(encoded)
        f.seek(0)
        self.send_response(200)
        self.send_header("Content-type", "text/html; charset=%s" % enc)
        self.send_header("Content-Length", str(len(encoded)))
        self.end_headers()
        shutil.copyfileobj(f,self.wfile)

httpd=HTTPServer(('',8080),MyHttpHandler)
print("Server started on 127.0.0.1,port 8080.....")
httpd.serve_forever()

 

然后用浏览器分别访问http://localhost:8080/  和http://localhost:8080/?t ,这里先以A页面代表第一个连接,B页面代表第二个连接,如果先访问A页面,则B页面也必须等待A页面完成后(5秒后)才出结果,请求被阻塞了

 

几经努力,在python3的socketserver模块找到了解决办法。其中解决这个问题的一个非常重要的类就是:ThreadingMixIn

看看这个类的__doc__:

"""Mix-in class to handle each request in a new thread."""

 太好了,正是我们要找到,参考官方的例子,得到这个Hello World多线程版代码如下:

#!coding=UTF-8
from http.server import HTTPServer,BaseHTTPRequestHandler
import io,shutil,time,socketserver
class MyThreadingHTTPServer(socketserver.ThreadingMixIn, HTTPServer):
    pass

class MyHttpHandler(BaseHTTPRequestHandler):
    def do_GET(self):
        print(self.path)
        if self.path=='/':time.sleep(5)
        print(self.path)
        r_str="Hello World";
        enc="UTF-8"
        encoded = ''.join(r_str).encode(enc)
        f = io.BytesIO()
        f.write(encoded)
        f.seek(0)
        self.send_response(200)
        self.send_header("Content-type", "text/html; charset=%s" % enc)
        self.send_header("Content-Length", str(len(encoded)))
        self.end_headers()
        shutil.copyfileobj(f,self.wfile)

httpd=MyThreadingHTTPServer(('',8080),MyHttpHandler)
print("Server started on 127.0.0.1,port 8080.....")
httpd.serve_forever()

 只需要很少改动,就能将程序变成多线程了,得益于python的多继承机制。官方的文档和例子:

http://docs.python.org/3.0/library/socketserver.html

 

同时,socketserver里还要一个多进程处理的类:ForkingMixIn,用法和这个一样,只是改下父类名

 

 

分享到:
评论

相关推荐

    Python-一个自己写的python3的简单到发指的爬虫

    8. **多线程或异步**:对于大规模的爬取,可以使用多线程或多进程提高效率,Python的threading或multiprocessing库可实现此功能。另外,异步IO(如asyncio库)也能提高爬虫的并发性能。 9. **延时与限制**:为了...

    2018_Python 标准库及拓展_7幅思维导图

    例如,print语句在Python 2中是语句,而在Python 3中被转换为一个函数。此外,Python 3中的字符串类型是Unicode,而Python 2则区分了str和unicode两种类型。在标准库方面,Python 3删除了一些不推荐使用的模块,如`...

    webrtc教程V3.0.pdf

    - **线程和消息**:实现多线程并发处理。 - **名称转换**:用于处理网络地址转换(NAT)。 - **Ssl支持**:提供安全的数据传输保障。 - **连接**:实现两个节点之间的连接。 - **传输,通道,连接**:实现数据在网络...

    Go Web 编程

    《GoWeb编程》采用了CC BY-SA 3.0许可证,意味着其他人可以在遵守相应条件的情况下自由地使用和修改内容,代码则遵循 BSD 3-Clause 许可证。 ### 结语 《GoWeb编程》不仅是一本关于Go语言Web开发的书籍,更是一个...

    Go WEB编程

    Go Web应用开发通常依赖于一个或多个Web框架,这些框架抽象和简化了诸如请求路由、会话管理、模板渲染等常见的Web开发任务。Go语言社区已经涌现出了多种优秀的Web框架,例如Gin、Echo、Beego等。这些框架使得Go Web...

    E旅游抢票器AirAisa 3.0

    4. **多线程处理**:为了提高效率,软件可能会使用多线程或异步处理技术,同时监控多个航班。 5. **安全防护**:考虑到可能会受到反爬策略的限制,抢票器需要具备一定的反反爬能力,如更换IP、设置请求间隔、模拟...

    3-13-3-redis-随堂笔记.docx

    3. 在标准的Linux服务器上,Redis可以轻松处理50万个并发连接,并且在高性能硬件环境下每秒可处理上百万个请求。 #### 13.1.4 Redis与Memcached对比 - **Memcached** 是一个分布式内存对象缓存系统,主要用于加速...

    大型网游交易平台 v3.0

    这可能涉及到多线程、异步编程和负载均衡技术。 6. **支付接口集成**:平台可能集成了第三方支付系统,如支付宝、微信支付等,需要掌握API调用和交易状态跟踪的技术。 7. **通知与消息推送**:交易完成后,系统...

    nodejs在windows下的安装配置

    - **单线程执行**:Node.js 使用单线程模型处理所有客户端请求,这意味着所有的函数调用都在同一个线程中执行,不存在线程安全问题,简化了编程模型。 #### 三、Node.js 版本选择与下载 - **官方网站**: ...

    2021-2022计算机二级等级考试试题及答案No.15193.docx

    在Web开发中,Servlet是Java中用于处理HTTP请求的服务端组件。当多个客户端请求同一个Servlet时,服务器通常不会为每个请求启动新的进程,而是使用线程复用机制来服务这些请求,以提高性能和资源利用率。 在Java中...

    2021-2022计算机二级等级考试试题及答案No.2801.docx

    25. `yield()`方法在多线程中用于释放当前线程的执行权,让相同优先级或更高优先级的就绪线程有机会运行。 26. 不能用于备份数据库的是`mysqladmin`,通常用`phpMyAdmin`、`mysqldump`或SQL语句进行备份。 27. 从...

    批量上传文件

    批量上传的核心在于分块上传或多线程上传技术。这种方式将大文件分割成若干小块,然后并发地上传这些小块,最后在服务器端再进行重组。这不仅提高了上传速度,还降低了单个文件上传失败带来的风险,因为即使部分块...

    精通dotnet核心技术高级特性

    在处理I/O密集型任务或网络请求时,异步编程至关重要。DotNet中的async/await关键字使得编写异步代码变得直观易懂。通过异步操作,程序可以避免阻塞主线程,提高用户体验。 4. **委托与事件(Delegates and Events...

    2021-2022计算机二级等级考试试题及答案No.12809.docx

    以上知识点涵盖了计算机二级考试中涉及的线程管理、数据库理论、GUI编程、SQL查询、数据库操作、事件处理、Web开发、操作系统使用等多个方面。学习这些内容有助于提升计算机应用技能,应对计算机二级考试。

    很好用的网站前端页面爬取工具

    在网站前端页面爬取工具中,爬虫通常由多线程或异步处理机制支持,能够高效地遍历和下载网页内容。爬虫的工作流程一般包括:发送请求、接收响应、解析内容、存储数据。 “爬取工具”通常是用户友好的图形界面应用,...

    iss安装文件包

    4. **性能优化**:IIS支持多线程处理,可以利用多核CPU资源提高性能。同时,IIS的缓存机制、静态内容压缩、HTTP压缩等功能可降低服务器负载,提高响应速度。 5. **管理工具**:IIS Manager是IIS的主要管理工具,...

    Apache Tomcat v9.0.4

    它能够处理大量并发请求,确保Web应用在高流量环境下依然能正常运行。这得益于其优秀的线程管理和内存管理策略。 4. **API扩展**:Tomcat 支持通过简单的API进行扩展,允许开发者自定义服务器的行为,例如添加新的...

    django+asyncio资料调研整合

    在IT行业中,异步编程是一种优化性能的有效方法,特别是在处理I/O密集型任务时,如网络请求、数据库操作等。然而,将异步编程引入到像Django这样的同步框架中并非易事。Django最初设计时并未考虑异步支持,但随着...

Global site tag (gtag.js) - Google Analytics