我nest_asyncio
在我的python项目中使用过。一切都很完美,除了那个aiohttp
函数get_running_loop
有一些警告信息填满了我的所有日志。
使用aiohttp
的实现get_running_loop
类似于:
def get_running_loop(loop=None):
if loop is None:
loop = asyncio.get_event_loop()
if not loop.is_running():
warnings.warn("The object should be created from async function",
DeprecationWarning,
stacklevel=3)
在最新版本中,他们甚至抛出异常:
def get_running_loop() -> asyncio.AbstractEventLoop:
loop = asyncio.get_event_loop()
if not loop.is_running():
raise RuntimeError(
"The object should be created within an async function"
)
return loop
但该nest_asyncio
loop
is_running
方法永远不会返回True
不阻止run_until_complete
.
我试图在像这样的其他导入之前做一个猴子补丁:
import aiohttp.helpers
def _get_running_loop(loop=None):
if loop is None:
loop = asyncio.get_event_loop()
return loop
aiohttp.helpers.get_running_loop = _get_running_loop
在所有导入之后,我看到这些aiohttp.helpers.get_running_loop
指向我的实现。但是 aiohttp 函数的调用仍然使用它自己的实现(因为相对导入或其他原因):
async with aiohttp.ClientSession() as session:
打印到日志:
The object should be created from async function
File ".../lib/python3.7/site-packages/aiohttp/client.py", line 225, in __init__
cookie_jar = CookieJar(loop=loop)
File ".../lib/python3.7/site-packages/aiohttp/cookiejar.py", line 55, in __init__
super().__init__(loop=loop)
File ".../lib/python3.7/site-packages/aiohttp/abc.py", line 146, in __init__
self._loop = get_running_loop(loop)
File ".../lib/python3.7/site-packages/aiohttp/helpers.py", line 276, in get_running_loop
stack_info=True)
我不想为此分叉所有 aiohttp 或分析 nest_asyncio 中的调用堆栈以对 aiohttp 有特殊响应。是否有可能在这里有一个简单的解决方案,比如猴子补丁,我怎样才能修补get_running_loop
在 asyncio 中使用的那个?