V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Richard14
V2EX  ›  Python

FastAPI 使用 sleep 后无法处理并发请求

  •  
  •   Richard14 · 2022-04-18 23:50:18 +08:00 · 2698 次点击
    这是一个创建于 936 天前的主题,其中的信息可能已经有所发展或是发生改变。

    按照官网提供的代码运行 hello world 服务器

    from fastapi import FastAPI
    import asyncio
    import uvicorn
    
    app = FastAPI()
    
    @app.get("/")
    async def root():
        print("sleeping")
        await asyncio.sleep(5) # 
        return {"message": "Hello World"}
    
    if __name__ == '__main__':
        uvicorn.run("server:app") 
    

    为了模拟单个请求处理时间较长的情况用了 asyncio.sleep 。但是运行之后发现如果在浏览器里同时发出三个请求,那么后端会等到第一个请求的 sleep 结束之后才会开始处理第二个请求,以此类推。

    感觉很怪,这里用的是 asyncio.sleep 而不是 time.sleep ,为啥会有这种表现呢,好像进程在调用 await asyncio.sleep()的当时就直接挂起了一样。正常不应该是单个协程 sleep 之后,事件循环还要清空其他线程的任务,全都没有任务了才会挂起等待 sleep 的回信么?

    6 条回复    2022-04-20 23:18:48 +08:00
    ClericPy
        1
    ClericPy  
       2022-04-19 00:06:13 +08:00   ❤️ 2
    chrome 浏览器一个 host 只创建一个连接(以前看到是 6 个)

    用 curl 测吧, 快成年经问题了...
    hhhhhh123
        2
    hhhhhh123  
       2022-04-20 11:13:01 +08:00
    你理解错了吧 asyncio 他是本质是单线程, 或者说是 单线程里面的多线程 , 顶多就是 一个睡 5 秒, 一个睡 3 秒, 正常的时间是 5 + 3 , 协程响应时间就会变成 5 秒 .. 这玩意不是很熟 可以看看文档: https://docs.python.org/zh-cn/3/library/asyncio-task.html
    hhhhhh123
        3
    hhhhhh123  
       2022-04-20 11:18:00 +08:00
    一个线程中含有 N 个耗时任务, 协程可以在一个线程中将 N 个耗时同时执行, 所以称为 单线程里的多线程
    zzl22100048
        4
    zzl22100048  
       2022-04-20 12:34:24 +08:00
    不要用浏览器测试
    Richard14
        5
    Richard14  
    OP
       2022-04-20 22:08:40 +08:00
    @ClericPy 谢谢,年经水问题丢人了

    @hhhhhh123 你写的东西我看了三分钟没看懂,我觉得想说的话没想好之前可以不说。。
    ClericPy
        6
    ClericPy  
       2022-04-20 23:18:48 +08:00
    @Richard14 不丢人, 这问题谁都遇到过, 当初让我懵逼了一星期

    关键遇到这种问题完全不知道该怎么搜, 用尽了我的 lowb 英语词汇量才搜到的. 属于那种反直觉的常识, 只能靠经验完全没思路
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2679 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 47ms · UTC 03:12 · PVG 11:12 · LAX 19:12 · JFK 22:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.