tornado ThreadPoolExecutor

本文介绍了一个使用Python Tornado框架实现的异步任务处理示例。通过创建线程池并在HTTP请求处理中使用装饰器来执行阻塞任务,从而避免阻塞Tornado的I/O循环。
import os
import sys 
import time

import tornado.httpserver
import tornado.ioloop
import tornado.options
import tornado.web
import tornado.gen
from tornado.concurrent import run_on_executor
from concurrent.futures import ThreadPoolExecutor
from tornado.options import define, options

class HasBlockTaskHandler(tornado.web.RequestHandler):
    executor = ThreadPoolExecutor(20)   #起线程池,由当前RequestHandler持有
    
    @tornado.gen.coroutine
    def get(self):
        strTime = time.strftime("%Y-%m-%d %H:%M:%S")
        print "in get before block_task %s" % strTime
        result = yield self.block_task(strTime)
        print "in get after block_task"
        self.write("%s" % (result))

    @run_on_executor
    def block_task(self, strTime):
        print "in block_task %s" % strTime
        for i in range(1, 16):
            time.sleep(1)
            print "step %d : %s" % (i, strTime)
        return "Finish %s" % strTime

if __name__ == "__main__":
    tornado.options.parse_command_line()
    app = tornado.web.Application(handlers=[(r"/sleep", HasBlockTaskHandler)], autoreload=False, debug=False)
    http_server = tornado.httpserver.HTTPServer(app)
    http_server.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

 

转载于:https://www.cnblogs.com/howhy/p/9627832.html

### Tornado框架在多线程场景下的优点 Tornado 是一个专注于异步 I/O 的 Python Web 框架,其设计初衷是为了处理高并发请求并保持低延迟响应。尽管它本身并不是一个多线程框架,但在某些情况下可以通过引入多进程或多线程机制来增强性能和功能。 #### 多线程实现的优点 1. **提高 CPU 密集型任务的效率** 当应用程序涉及大量计算密集型操作时,通过将这些任务分配到独立的线程中执行,可以有效利用多个 CPU 核心资源[^1]。这种方式能够显著减少主线程被阻塞的时间,从而提升整体吞吐量。 2. **改善 IO 阻塞性能瓶颈** 虽然 Tornado 原生支持非阻塞式的 IO 操作,但对于一些无法轻易转换成异步模式的操作(如数据库查询或外部 API 请求),采用多线程方式可以在后台完成耗时的任务而不会影响主事件循环[^3]。 3. **简化复杂业务逻辑的设计** 对于那些难以完全重构为纯协程形式的应用程序来说,在现有同步代码基础上增加额外的工作线程可能是一种更为实际可行的选择。这种方法不仅保留了原有结构清晰度还增加了灵活性[^2]。 #### 应用场景分析 - **实时数据流处理平台** 如在线聊天室、股票行情推送服务等需要持续不断地向客户端发送更新消息的服务非常适合使用 Tornado 结合多线程技术构建。因为这类应用通常既存在频繁的小规模读写需求又伴随偶尔的大批量运算过程。 - **混合负载环境中的微服务部署** 如果某个微服务体系内部既有简单的 RESTful 接口也有复杂的机器学习模型预测接口,则可以选择让前者继续沿用传统的单线程异步风格;而对于后者则启用专门负责繁重工作的子线程池来进行加速处理[^1]。 ```python import tornado.web from concurrent.futures import ThreadPoolExecutor class MainHandler(tornado.web.RequestHandler): executor = ThreadPoolExecutor(max_workers=4) async def get(self): result = await self.run_in_thread() self.write({"result": result}) def run_in_thread(self): # Simulate a heavy computation task. sum_of_squares = 0 for i in range(1_000_000): sum_of_squares += (i * i) return sum_of_squares def make_app(): return tornado.web.Application([ (r"/", MainHandler), ]) if __name__ == "__main__": app = make_app() app.listen(8888) tornado.ioloop.IOLoop.current().start() ``` 上面展示了一个简单例子说明如何集成 `ThreadPoolExecutor` 来管理长时间运行的任务。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值