异步并发处理利器:在 Jupyter Notebook 中玩转 asyncio
asyncio.run报错
RuntimeError: asyncio.run() cannot be called from a running event loop
在jupyter notebook
中运行下述代码就会出现上述报错
import uvicorn
from fastapi import FastAPI
from fastapi.responses import JSONResponse
app = FastAPI()
@app.get(“/”)
def root():
return JSONResponse({“status”:200}, status_code=405)
if name == ‘main’:
uvicorn.run(app, host=“127.0.0.1”, port=8080)
在 Jupyter Notebook 中使用 asyncio.run()
报错通常是因为 Jupyter Notebook 已经运行在一个事件循环(event loop)内部。asyncio.run()
函数是为了启动一个新的异步事件循环而设计的,它不应该在一个已经运行的事件循环内调用。
为了解决这个问题,你可以直接使用事件循环的现有实例
来运行你的异步代码
,而不是尝试创建一个新的。以下是一个示例,展示了如何在 Jupyter Notebook 中正确地运行异步代码:
import asyncio
async def main():
# 这里写你的异步代码
print('Hello')
await asyncio.sleep(1)
print('World')
# 在 Jupyter 中,你可以使用下面的方式来运行异步函数
await main()
如果你需要在一个非异步的上下文中运行异步代码,你可以使用如下方法:
import nest_asyncio
# 这行代码使得在已有的 event loop 中可以嵌套运行 asyncio.run
nest_asyncio.apply()
asyncio.run(main())
## nest_asyncio
nest_asyncio
是一个库,允许你在已有的 asyncio 事件循环中运行 asyncio.run()
。你可以通过以下命令安装 nest_asyncio
:
pip install nest_asyncio
在使用 nest_asyncio.apply()
后,你应该能够在 Jupyter Notebook 中正常使用 asyncio.run()
。但请注意,通常情况下,在 Jupyter Notebook 中直接使用 await
来调用异步函数更为简单和直接。
import uvicorn
from fastapi import FastAPI
from fastapi.responses import JSONResponse
app = FastAPI()
@app.get("/")
def root():
return JSONResponse({"status":200}, status_code=405)
import nest_asyncio
if __name__ == '__main__':
nest_asyncio.apply()
uvicorn.run(app, host="127.0.0.1", port=8080)