Python异步编程入门

本文是写给JavaScript程序员的Python教程。

历史上,Python并不支持专门的异步编程语法,因为不需要。

但是,多线程有"线程竞争"的问题,处理起来很复杂,还涉及加锁。对于简单的异步任务来说(比如与网页互动),写起来很麻烦。

Python3.4引入了asyncio模块,增加了异步编程,跟JavaScript的async/await极为类似,大大方便了异步任务的处理。它受到了开发者的欢迎,成为从Python2升级到Python3的主要理由之一。

asyncio模块最大特点就是,只存在一个线程,跟JavaScript一样。

由于只有一个线程,就不可能多个任务同时运行。asyncio是"多任务合作"模式(cooperativemultitasking),允许异步任务交出执行权给其他任务,等到其他任务完成,再收回执行权继续往下执行,这跟JavaScript也是一样的。

表面上,这是一个不合理的设计,明明有多线程多进程的能力,为什么放着多余的CPU核心不用,而只用一个线程呢?但是就像前面说的,单线程简化了很多问题,使得代码逻辑变得简单,写法符合直觉。

下面介绍asyncio模块最主要的几个API。注意,必须使用Python3.7或更高版本,早期的语法已经变了。

第一步,import加载asyncio模块。

importasyncio第二步,函数前面加上async关键字,就变成了async函数。这种函数最大特点是执行可以暂停,交出执行权。

asyncdefmain():第三步,在async函数内部的异步任务前面,加上await命令。

awaitasyncio.sleep(1)上面代码中,asyncio.sleep(1)方法可以生成一个异步任务,休眠1秒钟然后结束。

执行引擎遇到await命令,就会在异步任务开始执行之后,暂停当前async函数的执行,把执行权交给其他任务。等到异步任务结束,再把执行权交回async函数,继续往下执行。

第四步,async.run()方法加载async函数,启动事件循环。

asyncio.run(main())上面代码中,asyncio.run()在事件循环上监听async函数main的执行。等到main执行完了,事件循环才会终止。

下面是async函数的例子,新建一个脚本async.py,代码如下。

#!/usr/bin/envpython3#async.pyimportasyncioasyncdefcount():print("One")awaitasyncio.sleep(1)print("Two")asyncdefmain():awaitasyncio.gather(count(),count(),count())asyncio.run(main())上面脚本中,在async函数main的里面,asyncio.gather()方法将多个异步任务(三个count())包装成一个新的异步任务,必须等到内部的多个异步任务都执行结束,这个新的异步任务才会结束。

脚本的运行结果如下。

作为对比,下面是这个例子的同步版本sync.py。

#!/usr/bin/envpython3#sync.pyimporttimedefcount():print("One")time.sleep(1)print("Two")defmain():for_inrange(3):count()main()上面脚本的运行结果如下。

最后是一个异步编程的真实例子:操作无头浏览器。异步编程对代码的简化,在这个例子体现得淋漓尽致。

$python3-mpipinstallpyppeteer然后,写一个网页截图脚本screenshot.py。

执行这个脚本,当前目录下就会生成截图文件example.png。

(正文完)

Python是当下最火的编程语言,房地产大佬潘石屹都说要学。

不过,要写出更复杂的应用,或者从事数据分析、机器学习、Web开发等工作,就需要正规系统的学习了。建议从一个简单的小项目开始,然后不断完善功能,去学习更多新东西。

完成以上四步,就从一个初级Python使用者成长为一名熟练工了。当然说起来简单,真正实践起来并不容易。每一步都会有比较多的坑,对于没有经验的人来说,自学效率比较低。如果有一个经验丰富的老师带,效果会好很多。

(完)

KevinBlandy说:

james说:

screenshot.py这个例子中,虽然五个步骤可以异步处理,但它们之间明显有前后关系。也可以吗?

乐亦栗说:

nodeserver说:

引用james的发言:screenshot.py这个例子中,虽然五个步骤可以异步处理,但它们之间明显有前后关系。也可以吗?

zhaifg说:

"下面介绍asyncio模块最主要的几个API。注意,必须使用Python3.7或更高版本,早期的语法已经变了。"这个地方应该是从Python3.5起加入了await,不是3.7

softbase说:

这个栗子说明了什么呢?比起同步线程有任何优势吗?还是仅仅为了说明语法。

Pelops.Yao说:

那几张配图真好看!

花满楼说:

引用zhaifg的发言:"下面介绍asyncio模块最主要的几个API。注意,必须使用Python3.7或更高版本,早期的语法已经变了。"这个地方应该是从Python3.5起加入了await,不是3.7

没有说*await*,asyncio.run()是3.7才加上的

screamff说:

主要要自己分辨哪些方法、函数能用asyncio,哪些不能,比如requests就不能用原生asyncio,老司机用起来才会轻车熟路一点

kiwiyan说:

哈哈,虽然带硬广,但对初学者的指导作用还是不错的

yangzx说:

引用screamff的发言:主要要自己分辨哪些方法、函数能用asyncio,哪些不能,比如requests就不能用原生asyncio,老司机用起来才会轻车熟路一点

QAQ说:

ponder说:

asyncio模块最大特点就是,只存在一个线程-------------------------------------------

这里确切地说,只有一个eventloop线程,threading.Thread还是能正常使用的。

Jason说:

gaspar08说:

正是因为有前后关系,才用到await

MakaBaka说:

featue说:

本来也觉得没什么卵用,直到我去掉async和await后,一运行就报错了。~~~~

THE END
1.Python在线教程Python在线教程频道:汇集了大量精选的Python编程课程,从基础到高级、从入门到实战,有高清视频、图文教程、在线手册等,全部免费,欢迎在线学习!https://www.py.cn/course/list/96.html
2.Python编程菜鸟教程:从入门到精通的完全指南python菜鸟教程基础入门 Python安装:在官方网站下载安装包,根据不同操作系统进行安装。 Mac用户可直接使用Homebrew进行安装Windows用户需下载安装包后进行手动安装Linux用户可使用apt-get或yum进行安装基础语法:Python是一种解释型语言,支持面向对象、函数式和面向过程等多种编程范式。其语法简洁清晰,易于学习。 https://blog.csdn.net/2401_89285717/article/details/144333846
3.python2在线mob649e8154b5bf的技术博客Python2在线编程工具 在学习Python2或者需要使用Python2编写代码时,可以使用在线编程工具来快速编写和执行代码,而无需在本地安装Python2环境。下面介绍两个常用的Python2在线编程工具。 1. [Repl.it]( Repl.it是一个在线编程平台,支持多种编程语言,包括Python2。用户可以通过浏览器访问Repl.it,在线编写、运行和分享https://blog.51cto.com/u_16175435/11319077
4.Python快速编程入门(第2版).pdf黑马程序员2021年版Python快速编程入门(第2版).pdf-黑马程序员-2021年版-人民邮电出版社,本书以PyCharm为主要开发工具,采用理论与实训案例相结合的形式,系统性地讲解Python的核心知识。本书共11章,其中,第1~10章介绍Python语言的核心理论知识,包括基础知识、流程控制、字符串、组合数据https://max.book118.com/html/2021/0507/5303232144003224.shtm
5.《Python快速编程入门(第2版)》简介书评在线阅读当当木垛图书旗舰店在线销售正版《Python快速编程入门(第2版)》。最新《Python快速编程入门(第2版)》简介、书评、试读、价格、图片等相关信息,尽在DangDang.com,网购《Python快速编程入门(第2版)》,就上当当木垛图书旗舰店。http://product.dangdang.com/1827220222.html
6.WelcometoPython.orgThe official home of the Python Programming Languagehttps://www.python.org/
7.Python编程:从入门到实践(第3版)图书介绍 在线阅读 评论57 勘误 简介 本书是享誉全球的Python入门书,影响了超过250万读者。全书分两部分:第一部分介绍用Python编程所必须了解的基本概念,包括强大的Python库和工具,以及列表、字典、if语句、类、文件和异常、代码测试等内容;第二部分将理论付诸实践,讲解如何开发三个项目,包括简单的2D游戏、利用数据生https://www.ituring.com.cn/book/3038
8.Python编程(豆瓣)2星 0.4% 1星 0.3% 评价: 写笔记 写书评 加入购书单 分享到 推荐 内容简介· ··· 本书是一本针对所有层次的Python 读者而作的Python 入门书。全书分两部分:第一部分介绍用Python 编程所必须了解的基本概念,包括matplotlib、NumPy 和Pygal 等强大的Python 库和工具介绍,以及列表、字典、if 语句、类、文件https://book.douban.com/subject/26829016/
9.Python在线编程网站(免费的编程自学网站)2. Coding Bat 免费的在线编程站点,在上面可以集中精力进行编码,可以选择 Java 和 Python,短时间内就可以做很多的挑战,作者希望大家在学习编程的过程中,把更多的精力放在“大的编程问题”上,专注更深层次的知识,而不是都花在一些列表操作、循环等一些小的逻辑问题上。 https://qianu.com/news/253808.html
10.《Python快速编程入门(第2版)》(黑马程序员)摘要书评试读图书 > 大中专教材教辅 > 高职高专教材 > 人民邮电出版社 > Python快速编程入门(第2版) 自营 人民邮电出版社京东自营官方旗舰店 Python快速编程入门(第2版) 黑马程序员著 京东价 ¥ 促销 展开促销 配送至 --请选择-- 支持https://item.jd.com/13059394.html
11.Python3.0科学计算指南选择将Python作为其第一门编程语言的读者将在教师主导的课程中使用这本书。本书囊括了不同的主题,并提供背景阅读和实验。教师通常会依据入门课程的学习效果来选择和订购本书的材料。 已经具有编程经验以及喜欢科学计算或数学的读者,在潜心研究SciPy 和 NumPy时可以将该书作为参考资料。比如说Python中的编程与MATLAB中的https://www.epubit.com/bookDetails?id=N16459
12.Python编程从入门到实践1.python可以访问-1,-2元素,返回倒数第一、二个元素。 2.元素类型可以不一致。 3.1 列表访问和修改 1.访问和修改元素的方式和java数组一致,例如brands[0] ,需要注意,下标从0开始。 2.增加元素可以使用 方法,例如brands.append('BMW') 。 3.使用 https://www.jianshu.com/p/02769d278c0f
13.树莓派Python编程入门与实战(第2版)中文pdf扫描版[94MB]电子书下树莓派是一个只有信用卡大小的裸露电路板,它 也是一个运行开源Linux操作系统的完全可编程的PC 系统。树莓派的官方编程语言是Python,本书介绍了 在树莓派上进行Python编程的方法。 勃鲁姆/布莱斯纳罕编著的《树莓派Python编程 入门与实战(第2版)》共分7个部分。前6个部分介绍 了树莓派编程环境、Python编程基础、**https://www.jb51.net/books/633773.html
14.Python123Python 优雅胜于丑陋,简单胜于复杂,为你提供更好的 Python 学习体验。 我们相信,学习编程不在于它有多强大,而在于它能够给你怎样的力量!https://www.python123.io/index