关于使用协程的一点疑问

2019-12-23 17:11:38 +08:00
 aoscici2000
class ProductDetailHandler(BaseHandler):

    async def get(self):
        _id     = self.get_argument('id')
        product = await mgo.product.find_one({'_id': ObjectId(_id)})
        sku     = await mgo.sku.find({'pid': _id}).to_list(None)
        seller  = await mgo.user.find_one({'_id': product['seller_id']})
        product['seller'] = seller['name']
        product['sku']    = sku
        self.write({'err_code': 0, 'data': product})

像网上找的这个例子, 有一点小疑问, 这里本身 get() 就是一个协程函数了吧? 里面再开三个的话, 它自身不就是等于没事做了吗? 这算不算一种资源浪费?

3640 次点击
所在节点    Python
6 条回复
zhuangzhuang1988
2019-12-23 17:16:17 +08:00
wzwwzw
2019-12-23 18:43:02 +08:00
await 会把 cpu 资源让出来。
keepeye
2019-12-23 19:01:43 +08:00
asyncio.ensure_future 可以不用 await
CzaOrz
2019-12-23 20:34:10 +08:00
好像是 tornado~,你说的再开三个是指三次`await`,但是后面我没懂。
三次`await`就是三次`中断`,每次中断都有注册`任务`添加到`期程`的操作。注册后会释放 CPU 资源,之后就是等待或者执行其他已完成的`任务`,所以并没有浪费资源,整个流程没有线程的切换,效率高。而任务什么时候完成,由操作系统调度通知。
aoscici2000
2019-12-23 21:31:39 +08:00
@CzaOrz 大概懂了, 谢谢哈
676529483
2019-12-23 22:44:02 +08:00
单次调用肯定没区别啊,执行次数越多,优势越大

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/631586

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX