AI实践哪家强?来 AICon, 解锁技术前沿,探寻产业新机! 了解详情
写点什么

Python 3.5 将支持 Async/Await 异步编程

  • 2015-05-22
  • 本文字数:826 字

    阅读完需:约 3 分钟

根据 Python 增强提案 (PEP) 第 0492 号, Python 3.5 将通过 async 和 await 语法增加对协程的支持。该提案目的是使协程成为 Python 语言的原生特性,并“建立一种普遍、易用的异步编程思维模型。”

这个新提议中声明一个协程的语法如下:

复制代码
async def read_data(db):
pass

async 是明确将函数声明为协程的关键字,即便没有使用 await 表达式。这样的函数执行时会返回一个协程对象。

在协程函数内部,可在某个表达式之前使用 await 关键字来暂停协程的执行,以等待某进程完成:

复制代码
async def read_data(db):
data = await db.fetch('SELECT ...')
...

由于增强版生成器的存在,Python 中其实早已有了协程的形式,例如当yield 或yield from 声明在Python 生成器内部出现,该生成器就会被当作协程。

以下示例展示基于生成器的协程的用法:

复制代码
>>> def createGenerator():
... mylist = range(3)
... for i in mylist:
... yield i*i
...
>>> mygenerator = createGenerator()
>>> for i in mygenerator:
... print(i)
0
1
4

以上代码中,每当生成器在 for 循环中被调用,该生成器中的 for 循环就会返回一个新的值。

关于 await 用法的更多示例请参见上文提到的 PEP #0492.

这个关于协程的新提案想明确地把生成器与协程区分开,这么做有如下好处:

  • 使这两个概念对新开发者来说更易于理解,因为它们二者的语法并不一样;
  • 能消除由于重构时不小心移除了协程中的 yield 声明而导致的“不明确错误”,这会导致协程变成普通的生成器。

async/await 语法能让程序员以序列方式编写代码,但编译器则会将其当作一系列的协程来处理,从而实现有效的并发。回到我们之前的例子,async/await 使我们可以顺序地编写多个 await 声明语句,就好像每个语句都会阻塞并等待结果,但实际上这并不会导致任何阻塞:

复制代码
async def read_data(db):
data = await db.fetch('SELECT ...')
if (data...)
await api.send(data ...')

查看英文原文 Python 3.5 will Support Async/Await Asynchronous Programming

2015-05-22 09:079101

评论

发布
暂无评论
发现更多内容

leetcode 数组练习,java入门书籍

Java 程序员 后端

MyBatis01:初识 MyBatis 与 第一个 MyBaits 程序

Java 程序员 后端

Mysql中,21个写SQL的好习惯,你值得拥有呀(1)

Java 程序员 后端

Mybatis常考面试题汇总(附答案),学习SpringBoot

Java 程序员 后端

mybatis开发要点-insert主键ID获取和多参数传递

Java 程序员 后端

MyCat配置文件详解(二),java自学视频谁讲的好

Java 程序员 后端

Kafka性能调优实战:同等资源配置性能提升20几倍的秘诀

Java 程序员 后端

MongoDB入门操作汇总,网易架构师深入讲解Java开发

Java 程序员 后端

MyBatis 自定义 SQL 拦截器,java数据可视化技术

Java 程序员 后端

linux常用命令(一),阿里java面试算法

Java 程序员 后端

MyBatis 源码分析 - 插件机制,java容器面试题

Java 程序员 后端

Contour-v1.19.1发布

远鹏

golang Kubernetes cncf envoy contour

Linux服务器端网络抓包和分析实战,中高级Java面试题目汇总解答

Java 程序员 后端

Kotlin之DSL,java面试写代码

Java 程序员 后端

kubebuilder实战之三:基础知识速览,mybatis运行原理步骤

Java 程序员 后端

kubernetes部署metrics-server,linux服务器教程

Java 程序员 后端

Kurento实战之一:KMS部署和体验,应届毕业生java面试准备

Java 程序员 后端

linux防火墙iptables常用操作笔记,java开发手册百度网盘

Java 程序员 后端

MyBatis官方文档-日志,java高级开发工程师职责

Java 程序员 后端

MySQL事务:ACID特性的实现原理知多少,java教学视频百度云

Java 程序员 后端

Kubernetes 常用命令大全,震撼来袭免费下载

Java 程序员 后端

Mac下vagrant从安装到体验,经典实战教程

Java 程序员 后端

Mybatis学习笔记--自定义Mybatis,java程序员面试笔试宝典百度云

Java 程序员 后端

MySQL 事务隔离级别,进阶和基础哪一个难

Java 程序员 后端

架构营模块二作业

GTiger

架构实战营

markdown编辑器的使用教程,java面试笔试题程序题

Java 程序员 后端

MyBaitsPlus----知识盲点整理,mysql数据库项目式教程答案

Java 程序员 后端

Mysql中,21个写SQL的好习惯,你值得拥有呀,jvm原理面试题

Java 程序员 后端

Kubernetes任务调用Job与CronJob及源码分析(1)

Java 程序员 后端

Kubernetes官方java客户端之六:OpenAPI基本操作

Java 程序员 后端

MyEclipse优化、常用设置、快捷键,java视频教程百度云

Java 程序员 后端

Python 3.5将支持Async/Await异步编程_Python_Sergio De Simone_InfoQ精选文章