python - 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
当已经等待并且我的对象准备好时,将来我应该如何调用对象方法?如何安排它在未来被调用?
解决方案
等待调用,然后在返回的类的实例上调用该方法。
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
等待事件循环完成后将控制/焦点返回给它。- 表示其他计划任务已完成或正在等待某事。
我真的不知道调度算法是什么,我认为它是一个循环事件,但它可能比这更智能。
推荐阅读
- javascript - 如何在 js 中复制 div(没有 jQuery)
- python - 在python中从txt文件中绘制选定的值
- ionic-framework - Ionic 3,多次触发鼠标点击 - 已修复
- javascript - 将学生添加到虚拟教室
- scala - 如何使用火花将scala对象存储到cassandra表上
- javascript - react js中的状态变量有问题。无法将变量的值更新为 true
- rust - 实现 std Trait 时如何为生命周期参数设置适当的生命周期
- android - 隐式启动 JobIntentService
- boomi - 字符串索引超出范围:-1 in dell boomi
- python - TF服务出错:加载包'@org_tensorflow//tensorflow/python/keras'时出错: