【问题标题】:How to run an asyncio method from synchronous and asynchronous methods?如何从同步和异步方法运行 asyncio 方法?
【发布时间】:2020-02-07 06:05:47
【问题描述】:

在我的项目中,我有一个装饰器可以在同步方法中调用协程:

def async_test(f):
    def wrapper(*args, **kwargs):
        coro = asyncio.coroutine(f)
        future = coro(*args, **kwargs)
        loop = asyncio.get_event_loop()
        loop.run_until_complete(future)
    return wrapper


 @async_test
    async def test_foo(self):
        # test stuff

我需要这个装饰器来直接从我的 IDE 运行测试。

但是现在,我需要从 异步 方法(在 await 之后)调用它们,并且我有 RuntimeError

RuntimeError: 这个事件循环已经在运行

如何使用 asyncio 循环解决这个问题?

【问题讨论】:

  • 你能说明你是如何调用异步方法的吗?
  • 您的方法行不通,因为异步事件循环不可重入。您应该有独立同步入口点到异步功能,并使用await从其他异步函数调用异步函数。
  • 也许我应该找到绕过这个装饰器的方法

标签: python python-3.x async-await python-asyncio python-decorators


【解决方案1】:

我绕过装饰器解决了我的问题。现在,当我在异步函数中时,我只需要做await test_foo.bypass()

def async_test(f):
    def wrapper(*args, **kwargs):
        coro = asyncio.coroutine(f)
        future = coro(*args, **kwargs)
        loop = asyncio.get_event_loop()
        loop.run_until_complete(future)

    wrapper.bypass = f
    return wrapper

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    相关资源
    最近更新 更多