首页 > 解决方案 > Asyncio python:如何在协程中调用对象方法?

问题描述

我目前正在尝试做这样的事情:

import asyncio

class Dummy:
    def method(self):
        return 1
    def __str__(self):
        return "THIS IS A DUMMY CLASS"

async def start_doing():
    asyncio.sleep(1)
    return Dummy


async def do_something():
    return start_doing().method()


async def main():
    a = asyncio.create_task(do_something())
    b = asyncio.create_task(do_something())

    results = await asyncio.gather(a, b)
    print(results)

asyncio.run(main())

但我得到这个错误:

AttributeError: 'coroutine' object has no attribute 'method'

这表明我不能在协程对象上调用我的方法。解决此问题的一种方法是执行以下操作:

async def do_something():
    return (await start_doing()).method()

但我认为通过这样做,您本质上就是使您的代码同步。您不是在生成未来,而是等待您的工作完成do_something,然后继续执行队列中的下一个项目。

awaitable当已经等待并且我的对象准备好时,将来我应该如何调用对象方法?如何安排它在未来被调用?

标签: pythonpython-3.xasynchronousasync-awaitpython-asyncio

解决方案


等待调用,然后在返回的类的实例上调用该方法。

async def start_doing():
    await asyncio.sleep(1)
    return Dummy


async def do_something():
    thing = await start_doing()
    return thing().method()

当等待可等待对象并且我的对象已准备好时,我应该如何在将来调用对象方法?如何安排它在未来被调用?

看看我能不能把这个弄对。

  • 当您创建任务do_something时,它会被安排。
  • 最终,事件循环决定让我们do_something开始。
  • do_something调用start_doing并等待它。
  • do_something等待时,事件循环将控制权从它手中夺走并让其他东西轮流。
  • 在某些时间点start_doing被安排,开始,完成等待/睡眠,返回对象
    • 在等待/睡眠部分控制可能已被事件循环转移到其他任务
  • 最终在do_something等待事件循环完成后将控制/焦点返回给它。
    • 表示其他计划任务已完成或正在等待某事。

我真的不知道调度算法是什么,我认为它是一个循环事件,但它可能比这更智能。


推荐阅读