0

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 中使用的那个?

4

1 回答 1

0

我想你还需要猴子补丁 abc 模块:

import aiohttp.abc
aiohttp.abc.get_running_loop = _get_running_loop

在 vaex 中,我做了类似于 scikit-learn 的操作,但通过检查所有模块,请参阅https://github.com/vaexio/vaex/blob/95aecc9ae1a4285babd42a104d64ed52b5130d2d/packages/vaex-ml/vaex/ml/__init__.py#L284

于 2020-07-15T17:05:24.237 回答