gpt4 book ai didi

python - run_in_executor会阻塞吗?

转载 作者:行者123 更新时间:2023-12-03 12:44:08 25 4
gpt4 key购买 nike

假设我有一个像这样的Web服务器:

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)
据我了解,代码将在默认的ThreadExecutorPool中生成另一个线程,然后在线程池中执行阻塞函数。另一方面,考虑到GIL的工作原理,CPython解释器将只执行100 ticks的线程,然后公平地切换到另一个线程,并给其他线程一个进步的机会。在这种情况下,如果Python解释器决定切换到执行blocking_function的线程怎么办?它会阻止who解释器等待 time.sleep(5)上剩余的内容吗?
我之所以这样问,是因为我观察到有时我的应用程序会阻塞在 blocking_function上,但是由于我的 blocking_function很特殊,我不确定它在做什么,因为它通过win32com库与COM API对象通信。我试图排除这是我陷入的一些GIL陷阱。

最佳答案

time.sleep(如this question中所述)和win32com库(根据this mailing list post)都在被调用时释放GIL,因此它们不会阻止其他线程在阻塞时取得进展。
要回答“高级”问题-“run_in_executor可以(直接或间接)阻止事件循环吗?” -如果您使用了ThreadPoolExecutor,那么答案只会是"is",并且您在run_in_executor中执行的代码确实阻塞了没有发布GIL的工作。尽管这不会完全阻止事件循环,但这意味着事件循环线程和执行程序线程无法并行运行,因为两者都需要获取GIL才能取得进展。

关于python - run_in_executor会阻塞吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64545132/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com