dor*_*mon 5 python multithreading asynchronous python-asyncio fastapi
假设我有一个这样的网络服务器:
from fastapi import FastAPI
import uvicorn
import asyncio
app = FastAPI()
def blocking_function():
import time
time.sleep(5)
return 42
@app.get("/")
async def root():
loop = asyncio.get_running_loop()
result = await loop.run_in_executor(None, blocking_function)
return result
@app.get("/ok")
async def ok():
return {"ok": 1}
if __name__ == "__main__":
uvicorn.run(app, host="0.0.0.0", workers=1)
Run Code Online (Sandbox Code Playgroud)
据我了解,该代码将在默认的 ThreadExecutorPool 中生成另一个线程,然后在线程池中执行阻塞函数。另一方面,考虑GIL是如何工作的,CPython解释器只会执行一个线程100 ticks,然后它会切换到另一个线程以公平,并给其他线程一个进步的机会。在这种情况下,如果 Python 解释器决定切换到正在执行 blocks_function 的线程怎么办?它会阻止 who 解释器等待剩余的任何内容time.sleep(5)吗?
我问这个的原因是,我观察到,有时我的应用程序将阻止的blocking_function,但我不能完全肯定在玩什么的这里我blocking_function是很特殊-它通过win32com库会谈到COM API对象。我试图排除这是我陷入的一些 GIL 陷阱。
| 归档时间: |
|
| 查看次数: |
600 次 |
| 最近记录: |