我目前正在尝试做这样的事情:
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/