PEP 0492 - Python 3.5 async 关键字

9 浏览
0 Comments

PEP 0492 - Python 3.5 async 关键字

PEP 0492在Python 3.5中引入了关键字async。Python如何从使用这个运算符中受益?给出了一个协程的例子:

async def read_data(db):
    data = await db.fetch('SELECT ...')

。根据文档,这个例子可以实现

暂停执行read_data协程,直到db.fetch awaitable完成并返回结果数据。

这个async关键字是否涉及创建新线程,或者可能使用现有的保留的异步线程?如果async确实使用了保留线程,那么它们是各自独立的单个共享线程吗?

0
0 Comments

PEP 0492 - Python 3.5 async keyword 是为了解决使用生成器编写协程时的一些困惑而提出的。在Python 3.4以前,可以使用生成器来编写协程,通过在函数体中使用yield或yield from表达式创建一个生成器对象,只有在迭代生成器时才执行代码。结合其他事件循环库(如asyncio),可以编写协程,向事件循环发出信号,告知它们即将进行繁忙的操作(例如等待I / O),在此期间可以运行另一个协程。

然而,由于生成器可以用于各种任务,不仅仅是协程,而且使用生成器语法编写协程可能会让新手感到困惑。因此,PEP 0492 引入了新的语法,使得编写协程更加清晰明了。通过引入async关键字,可以声明一个协程函数。

使用async关键字重写上述示例代码如下:

async def display_date(loop):
    end_time = loop.time() + 5.0
    while True:
        print(datetime.datetime.now())
        if (loop.time() + 1.0) >= end_time:
            break
        await asyncio.sleep(1)

新的协程对象仍然需要一个事件循环来驱动协程。事件循环会依次等待每个协程,执行那些目前没有等待任何操作的协程。

使用原生支持的优势是,还可以引入其他语法来支持异步上下文管理器和迭代器。进入和退出上下文管理器,或者循环遍历迭代器,都可以成为协程中的可中断点,表示其他代码可以运行,因为某些操作正在等待。

总结一下,PEP 0492 的出现是为了解决使用生成器编写协程的困惑,并引入了新的语法async来声明协程函数,使得编写和理解协程更加清晰明了。这样的改进带来了许多优势,例如支持异步上下文管理器和迭代器,使得协程的使用更加方便和灵活。

0