Python asyncio:函数或协程,使用哪个?

斯科文

我想知道foo之间的性能是否存在明显差异bar

class Interface:
    def __init__(self, loop):
        self.loop = loop

    def foo(self, a, b):
        return self.loop.run_until_complete(self.bar(a, b))

    async def bar(self, a, b):
        v1 = await do_async_thing1(a)
        for i in range(whatever):
            do_some_syncronous_work(i)
        v2 = await do_async_thing2(b, v1)
        return v2

async def call_foo_bar(loop):
    a = 'squid'
    b = 'ink'
    interface = Interface(loop)
    v_foo = interface.foo(a, b)
    v_bar = await interface.bar(a, b)

但是使用run_until_complete原因会导致与运行我的程序有任何实际的,明显的不同吗?

(我问的原因是我正在构建一个接口类,以容纳可分解的“后端”,其中某些后端可能是异步的。我希望为接口类的公共(可重用)方法使用标准函数,因此可以为所有代码维护API,而不会弄乱使用可用事件循环的异步后端。)

更新:我没有正确检查代码,第一个版本完全无效,因此被重写。

安德鲁·斯维特洛夫(Andrew Svetlov)

loop.run_until_complete()应该在协程之外的最顶层使用。禁止run_until_complete()使用活动(运行)事件循环进行调用

loop.run_until_complete(f)也是一个阻塞调用:阻塞执行线程,直到f 协程将来完成为止

async def通过创建可能相互通信的并发协程是一种编写异步代码的正确方法

async def需要运行事件循环(loop.run_until_complete()loop.run_forever()应调用)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

内置函数的Python协程

来自分类Dev

Python asyncio取消未等待的协程

来自分类Dev

Python asyncio取消未等待的协程

来自分类Dev

Python 3 Asyncio 协程相等

来自分类Dev

在Python中从协程调用协程

来自分类Dev

在Python中从协程调用协程

来自分类Dev

如何由于超时而从已取消的python asyncio协程返回值

来自分类Dev

在Tornado协程中使用常规Python生成器

来自分类Dev

使用协程在python中实现责任链模式

来自分类Dev

在 Python Tornado Web Server 中使用协程

来自分类Dev

与Python 3.5的原生协程相比,Tornado协程的优势

来自分类Dev

如何在Python中编写自己的异步/等待协程函数?

来自分类Dev

Python原生协程和send()

来自分类Dev

Python中的协程:最佳实践

来自分类Dev

Python的协程类型在哪里定义?

来自分类Dev

Python协程在产量上未知

来自分类Dev

Python 生成器协程

来自分类Dev

如何在 Python 中使用带有协程的装饰器?

来自分类Dev

使用asyncio协程并行运行功能?

来自分类Dev

在没有协程的情况下编写出色的Scala(包括使用yield的Python示例)

来自分类Dev

是否有任何理由在异步/等待上使用基于Python的基于生成器的协程?

来自分类Dev

使用协程使函数返回在回调中获得的值

来自分类Dev

如何使用Kotlin协程调用阻塞函数?

来自分类Dev

函数无法使用协程块返回项目

来自分类Dev

为什么不能递归调用Python协程?

来自分类Dev

python龙卷风RequestHandler协程安全吗?

来自分类Dev

Python 3中仍然有协程吗?

来自分类Dev

龙卷风协程中的Python日志记录问题

来自分类Dev

Python Discord.py`time.sleep()`协程