python并发编程: Python使用线程池在Web服务中实现加速

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时计算 Flink 版,5000CU*H 3个月
简介: python并发编程: Python使用线程池在Web服务中实现加速

往期文章:

  1. 并发编程简介
  2. 怎样选择多线程多进程多协程
  3. Python速度慢的罪魁祸首,全局解释器锁GIL
  4. 使用多线程,Python爬虫被加速10倍
  5. Python实现生产者消费者爬虫
  6. Python线程安全问题以及解决方案
  7. Python好用的线程池ThreadPoolExecutor

web服务的架构以及特点

web后台服务的特点:

  • web服务对响应时间要求非常高,比如要求200ms返回
  • web服务有大量的依赖IO操作的调用,比如磁盘文件、数据库、远程API
  • web服务经常需要处理几万人、几百万人的同时请求

使用线程池ThreadPoolExecutor加速

使用线程池ThreadPoolExecutor的好处:

  • 方便的将磁盘文件、数据库、远程API的IO调用并发执行
  • 线程池的线程数目不会无限创建(导致系统挂掉),具有防御功能

代码用FastAPI实现Web服务并实现加速

不使用进程池方式

from fastapi import FastAPI
import time

app = FastAPI()

def read_file():
    time.sleep(0.1)
    return "result_file"

def read_db():
    time.sleep(0.2)
    return "read_db"

def read_api():
    time.sleep(0.3)
    return "read_api"

@app.get("/")
def index():
    return {
   
   
        "result_file":read_file(),
        "read_db":read_db(),
        "read_api":read_api()
        }


if __name__  == "__main__":
    import uvicorn
    uvicorn.run(app)

运行结果如下:

使用进程池方式

from fastapi import FastAPI
import time
from concurrent.futures import ThreadPoolExecutor


app = FastAPI()
pool = ThreadPoolExecutor()

def read_file():
    time.sleep(0.1)
    return "result_file"

def read_db():
    time.sleep(0.2)
    return "read_db"

def read_api():
    time.sleep(0.3)
    return "read_api"

@app.get("/")
def index():
    result_file  = pool.submit(read_file)
    result_db  = pool.submit(read_db)
    result_api  = pool.submit(read_api)
    return {
   
   
        "result_file":result_file.result(),
        "read_db":result_db.result(),
        "read_api":result_api.result()
        }


if __name__  == "__main__":
    import uvicorn
    uvicorn.run(app)

运行结果如下:

目录
相关文章
|
4天前
|
分布式计算 并行计算 安全
在Python Web开发中,Python的全局解释器锁(Global Interpreter Lock,简称GIL)是一个核心概念,它直接影响了Python程序在多线程环境下的执行效率和性能表现
【6月更文挑战第30天】Python的GIL是CPython中的全局锁,限制了多线程并行执行,尤其是在多核CPU上。GIL确保同一时间仅有一个线程执行Python字节码,导致CPU密集型任务时多线程无法充分利用多核,反而可能因上下文切换降低性能。然而,I/O密集型任务仍能受益于线程交替执行。为利用多核,开发者常选择多进程、异步IO或使用不受GIL限制的Python实现。在Web开发中,理解GIL对于优化并发性能至关重要。
22 0
|
9天前
|
消息中间件 并行计算 Java
Python中的并发编程
本文介绍了Python中的并发编程,并具体介绍了线程、进程、协程的基本用法和案例。
Python中的并发编程
|
11天前
|
数据挖掘 程序员 调度
Python并发编程之协程与异步IO
传统的多线程和多进程模型在处理大规模并发时存在一些性能瓶颈和资源消耗问题。本文将重点介绍Python中基于协程和异步IO的并发编程方法,探讨其工作原理和实际应用,帮助开发者更好地理解并利用Python的并发编程能力。
|
4天前
|
数据采集 算法 数据处理
Python并发编程:异步IO与多线程的比较与应用
本文探讨了Python中异步IO和多线程两种并发编程模型的优劣及其在实际应用中的适用性。通过比较它们在性能、资源消耗和代码复杂度等方面的差异,分析了不同场景下选择合适的并发模型的策略和方法。
|
12天前
|
JSON API 数据库
Python使用Quart作为web服务器的代码实现
Quart 是一个异步的 Web 框架,它使用 ASGI 接口(Asynchronous Server Gateway Interface)而不是传统的 WSGI(Web Server Gateway Interface)。这使得 Quart 特别适合用于构建需要处理大量并发连接的高性能 Web 应用程序。与 Flask 类似,Quart 也非常灵活,可以轻松地构建 RESTful API、WebSockets、HTTP/2 服务器推送等。
|
8天前
|
Python
python搭建文件服务
python搭建文件服务
11 1
|
10天前
|
算法 API 调度
|
2天前
|
安全 Java 开发者
Python中的多线程高级使用方法
**Python多线程高级指南摘要** 本文探讨了Python中多线程的高级技术,尽管GIL限制了并行执行,但多线程仍适用于IO密集型任务和提升UI响应。内容包括: - 使用`threading`模块导入和创建线程,示例展示了如何启动多个线程执行函数。 - 高级用法涉及线程池,通过`ThreadPoolExecutor`管理线程,简化大量线程的创建和控制。 - 线程同步:介绍锁和条件变量的概念,以及如何使用它们确保数据一致性。 - 避免死锁的策略,如使用`try/finally`确保锁的正确释放 - 线程局部数据(Thread Local Data)允许每个线程拥有独立的数据副本,避免冲突
|
2天前
|
安全 数据处理 调度
Python多线程编程详解
Python多线程编程详解
|
3天前
|
Java UED Python
Python多线程编程实战技巧与性能优化策略
Python多线程编程实战技巧与性能优化策略