python - 异步 python : How to call object methods in coroutines?

标签 python python-3.x asynchronous async-await python-asyncio

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

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()

但我认为,通过这样做,您本质上就可以使代码同步。您并不是在生成 future ,而是等待 do_something 中的工作完成,然后继续处理队列中的下一项。

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

最佳答案

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

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


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

How should I call an object method in the future when the awaitable has been awaited and my object is ready? how to schedule it to be called in the future?

看看我是否能得到正确的结果。

  • 当您创建任务 do_something 时,它就会被安排。
  • 最终事件循环决定让 do_something 启动。
  • do_something 调用 start_doing 并等待它。
  • do_something 等待时,事件循环会夺走控制权,让其他事情轮流进行。
  • 在某些时间点 start_doing 被调度、启动、完成等待/ sleep 、返回对象
    • 在等待/ sleep 部分,控制权可能已通过事件循环转移到其他任务
  • 最终,在 do_something 等待完成后,事件循环将控制权/焦点交还给它。
    • 暗示其他计划任务已完成或正在等待某些事情。

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

关于python - 异步 python : How to call object methods in coroutines?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62625208/

相关文章:

python - 如何迭代命名关键字参数?

ios - Obj-C 异步基础 - 在这种简单的情况下该怎么做?

javascript - Promise 中异步执行的代码在哪里?

python - 安装python包时如何让pip写入默认配置文件?

python - 子类避免父类的元类

python - 在 Python 3.5 中,如何将函数指定为类型提示?

javascript - 为什么包含在一个字符串变量中的 Javascript 一旦被分配给另一个字符串变量就会立即执行?

python - 在 Spyder 中调试 Python 脚本(带标志)

python - 如何在 Django 中使用 ManyToMany 关系进行过滤注解?

python - 数据框到 frozenset