分享

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

 攻城狮成长日志 2023-10-13 发布于广东

往期文章:

  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)

运行结果如下:

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多