首页 > 后端开发 > Python教程 > 在 FastAPI 端点中使用 `concurrent.futures.ThreadPoolExecutor` 有风险吗?

在 FastAPI 端点中使用 `concurrent.futures.ThreadPoolExecutor` 有风险吗?

Patricia Arquette
发布: 2024-11-12 07:20:02
原创
282 人浏览过

Is using a `concurrent.futures.ThreadPoolExecutor` in a FastAPI endpoint risky?

在 FastAPI 端点中使用 Concurrent.futures.ThreadPoolExecutor 有风险吗?

问题陈述:

在提供的测试代码中, ThreadPoolExecutor 用于同时从多个网站检索数据。令人担忧的是,在 FastAPI 端点中使用此方法可能会导致过多的线程创建和资源匮乏和应用程序崩溃等潜在问题。

问题和潜在问题:

  • 线程耗尽:创建过多的线程会耗尽系统的线程池,导致线程饥饿并可能导致应用程序或主机崩溃。
  • 资源争用:线程争夺系统资源,例如内存和 CPU,这可能会减慢应用程序并影响性能。
  • 同步性:在多线程环境中管理线程之间的同步可能很复杂,并且会引入潜在的竞争

推荐解决方案:使用 HTTPX 库

建议使用提供异步 API 的 HTTPX 库,而不是使用 ThreadPoolExecutor。 HTTPX 提供了许多优点:

  • 异步操作: HTTPX 异步工作,可以在不阻塞线程池的情况下高效处理并发请求。
  • 连接池管理:它自动管理连接池,确保连接被重用并限制活动数量连接。
  • 细粒度控制: HTTPX 允许自定义连接限制和超时,提供对资源使用的精确控制。
  • 与 FastAPI 的简化集成: FastAPI 可以与 HTTPX 无缝集成,利用 HTTPX 提供的异步支持

工作示例:

from fastapi import FastAPI, Request
from contextlib import asynccontextmanager
import httpx
import asyncio

URLS = ['https://www.foxnews.com/',
        'https://edition.cnn.com/',
        'https://www.nbcnews.com/',
        'https://www.bbc.co.uk/',
        'https://www.reuters.com/']

@asynccontextmanager
async def lifespan(app: FastAPI):
    # Customise settings
    limits = httpx.Limits(max_keepalive_connections=5, max_connections=10)
    timeout = httpx.Timeout(5.0, read=15.0)  # 5s timeout on all operations

    # Initialise the Client on startup and add it to the state
    async with httpx.AsyncClient(limits=limits, timeout=timeout) as client:
        yield {'client': client}
        # The Client closes on shutdown

app = FastAPI(lifespan=lifespan)

async def send(url, client):
    return await client.get(url)

@app.get('/')
async def main(request: Request):
    client = request.state.client
    tasks = [send(url, client) for url in URLS]
    responses = await asyncio.gather(*tasks)
    return [r.text[:50] for r in responses]  # For demo purposes, only return the first 50 chars of each response
登录后复制

此代码片段演示了如何使用 HTTPX 与 FastAPI 异步处理并发请求,有效缓解相关问题线程耗尽和资源争用。

以上是在 FastAPI 端点中使用 `concurrent.futures.ThreadPoolExecutor` 有风险吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板