python tornado多线程_Tornado与线程池

本文介绍了如何在Tornado中利用线程池处理同步阻塞任务,以提升性能。通过示例展示了两种使用线程池的方式:在RequestHandler中使用线程池执行耗时任务,以及使用全局线程池托管http请求处理方法。同时,讨论了GIL对Python多线程的影响,指出在IO密集型任务中,线程池仍能有效提升性能。
摘要由CSDN通过智能技术生成

Tornado本身的设计目标是单线程异步非阻塞,要想很好的发挥它的性能最好使用异步IO,并且Tornado本身也提供了异步的AsyncHttpClient的实现,配合gen.coroutine和yield,可以让请求异步执行从而不阻塞当前线程,对于单线程服务器来说,阻塞(blocking)和同步的sleep这种会挂起线程的动作都是服务器的噩梦,因为只有一个线程,所以任何等待都会影响服务器对于其他请求的处理。

异步非阻塞对于第三方IO是http请求的情况还好,毕竟可以使用Tornado提供的异步实现,但是对于有些数据库的IO,则需要异步库的支持,比如针对MongoDB的Motor等。但是第三方异步库的质量也是参差不齐,在实际的工程中,假如没有特别好的异步库的时候,还是只能使用同步的库。

假如只能使用同步阻塞的IO,为了提高性能,可以考虑在Tornado中使用线程池。线程池可以考虑使用concurrent.futures里的ThreadPoolExecutor。

1. 在RequestHandler的http请求处理方法(get/post等)中使用线程池

线程池为RequestHandler持有,请求处理逻辑中的耗时/阻塞任务可以提交给线程池处理,主循环逻辑可以继续处理其他请求,线程池内的任务处理完毕后,会通过回调注册callback到ioloop,ioloop可以通过执行callback恢复挂起的请求处理逻辑。

import tornado.web

import tornado.gen

from tornado.concurrent import run_on_executor

from concurrent.futures import ThreadPo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值