python编程入门-Python 异步编程入门
本文是写给 JavaScript 程序员的 Python 教程。
Python 的异步编程,其他人可能觉得很难,但是 JavaScript 程序员应该特别容易理解,因为两者的概念和语法类似。JavaScript 的异步模型更简单直观,很适合作为学习 Python 异步的基础。
本文解释 Python 的异步模块 asyncio 的概念和基本用法,并且演示如何通过 Python 脚本操作无头浏览器 pyppeteer 。
一、Python 异步编程的由来
历史上,Python 并不支持专门的异步编程语法,因为不需要。
有了多线程(threading)和多进程(multiprocessing),就没必要一定支持异步了。如果一个线程(或进程)阻塞,新建其他线程(或进程)就可以了,程序不会卡死。
但是,多线程有"线程竞争"的问题,处理起来很复杂,还涉及加锁。对于简单的异步任务来说(比如与网页互动),写起来很麻烦。
Python 3.4 引入了 asyncio 模块,增加了异步编程,跟 JavaScript 的async/await 极为类似,大大方便了异步任务的处理。它受到了开发者的欢迎,成为从 Python 2 升级到 Python 3 的主要理由之一。
二、asyncio 的设计
asyncio 模块最大特点就是,只存在一个线程,跟 JavaScript 一样。
由于只有一个线程,就不可能多个任务同时运行。asyncio 是"多任务合作"模式(cooperative multitasking),允许异步任务交出执行权给其他任务,等到其他任务完成,再收回执行权继续往下执行,这跟 JavaScript 也是一样的。
由于代码的执行权在多个任务之间交换,所以看上去好像多个任务同时运行,其实底层只有一个线程,多个任务分享运行时间。
表面上,这是一个不合理的设计,明明有多线程多进程的能力,为什么放着多余的 CPU 核心不用,而只用一个线程呢?但是就像前面说的,单线程简化了很多问题,使得代码逻辑变得简单,写法符合直觉。
asyncio 模块在单线程上启动一个事件循环(event loop),时刻监听新进入循环的事件,加以处理,并不断重复这个过程,直到异步任务结束。事件循环的内部机制,可以参考 JavaScript 的模型,两者是一样的。
三、asyncio API
下面介绍 asyncio 模块最主要的几个API。注意,必须使用 Python 3.7 或更高版本,早期的语法已经变了。
第一步,import 加载 asyncio 模块。
import asyncio
第二步,函数前面加上 async 关键字,就变成了 async 函数。这种函数最大特点是执行可以暂停,交出执行权。
async def main():
第三步,在 async 函数内部的异步任务前面,加上await命令。
await asyncio.sleep(1)
上面代码中,asyncio.sleep(1) 方法可以生成一个异步任务,休眠1秒钟然后结束。
执行引擎遇到await命令,就会在异步任务开始执行之后,暂停当前 async 函数的执行,把执行权交给其他任务。等到异步任务结束,再把执行权交回 async 函数,继续往下执行。
第四步,async.run() 方法加载 async 函数,启动事件循环。
asyncio.run(main())
上面代码中,asyncio.run() 在事件循环上监听 async 函数main的执行。等到 main 执行完了,事件循环才会终止。
四、async 函数的示例
下面是 async 函数的例子,新建一个脚本async.py,代码如下。
#!/usr/bin/env python3
# async.py
import asyncio
async def count():
print("One")
await asyncio.sleep(1)
print("Two")
async def main():
await asyncio.gather(count(), count(), count())
asyncio.run(main())
上面脚本中,在 async 函数main的里面,asyncio.gather() 方法将多个异步任务(三个 count())包装成一个新的异步任务,必须等到内部的多个异步任务都执行结束,这个新的异步任务才会结束。
脚本的运行结果如下。
$ python3 async.py
One
One
One
Two
Two
Two
上面运行结果的原因是,三个 count() 依次执行,打印完 One,就休眠1秒钟,把执行权交给下一个 count(),所以先连续打印出三个 One。等到1秒钟休眠结束,执行权重新交回第一个 count(),开始执行 await 命令下一行的语句,所以会接着打印出三个Two。脚本总的运行时间是1秒。
作为对比,下面是这个例子的同步版本 sync.py。
#!/usr/bin/env python3
# sync.py
import time
def count():
print("One")
time.sleep(1)
print("Two")
def main():
for _ in range(3):
count()
main()
上面脚本的运行结果如下。
$ python3 sync.py
One
Two
One
Two
One
Two
上面运行结果的原因是,三个 count() 都是同步执行,必须等到前一个执行完,才能执行后一个。脚本总的运行时间是3秒。
五、实例:pyppeteer 模块
最后是一个异步编程的真实例子:操作无头浏览器。异步编程对代码的简化,在这个例子体现得淋漓尽致。
我们需要用到 pyppeteer 模块,它是无头浏览器 Puppeteer 的 Python 移植,API 跟 JavaScript 版本基本一致。下面是安装命令。
$ python3 -m pip install pyppeteer
然后,写一个网页截图脚本screenshot.py。
#!/usr/bin/env python3
# screenshot.py
import asyncio
from pyppeteer import launch
async def main():
browser = await launch()
page = await browser.newPage()
await page.goto('http://example.com')
await page.screenshot({'path': 'example.png'})
await browser.close()
asyncio.run(main())
上面代码中,启动浏览器(launch)、打开新 Tab(newPage())、访问网址(page.goto())、截图(page.screenshot())、关闭浏览器(browser.close()),这一系列操作都是异步任务,使用 await 命令写起来非常自然简单。
执行这个脚本,当前目录下就会生成截图文件 example.png。
$ python3 screenshot.py
如果脚本执行时报错 No usable sandbox!,可以参考这里。另外,第一次执行这个脚本,会下载安装 Puppeteer,可能需要等待较长时间,但是此后的执行就会很快。
Pyppeteer 的官网还有其他实例,比如向网页注入 JavaScript 代码,大家可以自己试玩。
六、参考链接
(正文完)
如何通过实战项目快速提升 Python 开发技能?
Python 是当下最火的编程语言,房地产大佬潘石屹都说要学。
它上手极为简单,短时间内你就能写出解决实际问题的小程序,甚至去面试初级 Python 工程师的职位。
不过,要写出更复杂的应用,或者从事数据分析、机器学习、Web 开发等工作,就需要正规系统的学习了。建议从一个简单的小项目开始,然后不断完善功能,去学习更多新东西。
第一步:写一个最简单的爬虫,比如获取 B 站的弹幕或豆瓣的书评影评。
第二步:单线程爬虫扩展为多线程爬虫,了解进程、线程、锁。
第三步:对收集的数据进行清洗和分析。
第四步:将数据报告在 Web 端展示,了解 MVC 设计模式、Web 框架、数据库操作。
完成以上四步,就从一个初级 Python 使用者成长为一名熟练工了。当然说起来简单,真正实践起来并不容易。每一步都会有比较多的坑,对于没有经验的人来说,自学效率比较低。如果有一个经验丰富的老师带,效果会好很多。
尹会生,金山公司西山居运维总监,在极客时间讲过《零基础学Python》和《Linux实战技能100讲》两个课程,参与编写过 《白话大数据与机器学习》 《运维前线》等书籍。
他与极客时间合作,推出了线下+线上相结合的《Python 进阶训练营》,手把手、面对面地帮助你,50天内实现 Python 开发技能的进阶和突破,完成上面四步,从初级使用者成长为专业选手。
4 个实战项目串联起全部关键知识
4 天线下教学 + 5 次线上直播 + 7 周刻意练习 + 助教每日答疑
高效学习社群 + 班主任带班
一线大厂和 TGO 鲲鹏会600多家企业面试直通车。优秀毕业生一年内获得两次企业内推服务。
原价 ¥3600, 早鸟特惠 ¥2499,早鸟仅限 100 人 ,微信扫描下方二维码,立即加入????
无论是否报名,微信扫描下方二维码,即可免费获取 Python 学习资料包。
(完)
python编程入门-Python 异步编程入门相关推荐
- python异步编程视频_asyncio异步编程【含视频教程】
Python Python开发 Python语言 asyncio异步编程[含视频教程] 不知道你是否发现,身边聊异步的人越来越多了,比如:FastAPI.Tornado.Sanic.Django 3. ...
- python协程和异步编程
文章目录 协程 & 异步编程(asyncio) 1. 协程的实现 1.1 greenlet 1.2 yield 1.3 asyncio 1.4 async & awit 1.5 小结 ...
- 【转】1.6异步编程:IAsyncResult异步编程模型 (APM)
传送门:异步编程系列目录-- 大部分开发人员,在开发多线程应用程序时,都是使用ThreadPool的QueueUserWorkItem方法来发起一次简单的异步操作.然而,这个技术存在许多限制.最大的问 ...
- 异步编程-线程实现异步编程
异步编程-线程实现异步编程 使用线程实现异步 第一种方式 第二种方式 问题 在日常开发中我们经常会遇到这样的情况,即需要异步地处理一些事情,而不需要知道异步任务的结果.比如在调用线程里面异步打日志,为 ...
- 【学习笔记】Part1·JavaScript·深度剖析-函数式编程与 JS 异步编程、手写 Promise(二、JavaScript 异步编程)
[学习笔记]Part1·JavaScript·深度剖析-函数式编程与 JS 异步编程.手写 Promise(课前准备) [学习笔记]Part1·JavaScript·深度剖析-函数式编程与 JS 异步 ...
- promise 浏览器实现的源码_【大前端01-01】函数式编程与JS异步编程、手写Promise...
[简答题]一.谈谈你是如何理解JS异步编程的,EventLoop.消息队列都是做什么的,什么是宏任务.什么是微任务? 如何理解JS异步编程 众所周知JavaScript语言执行环境是"单线程 ...
- python asyncio_Python 中的异步编程:Asyncio
异步和同步的代码对比 现在我们实际验证异步模式的切实有效,我会比较两段 python 脚本,这两个脚本除了sleep方法外,其余部分完全相同.在第一个脚本里,我会用标准的 time.sleep 方法, ...
- python协程编程实例_Python异步编程之协程任务的调度操作实例分析
{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...
- python 多线程和协程结合_Python 异步编程,看这门课就够了~
我们常见的 Linux.Windows.Mac OS 操作系统,都是支持多进程的多核操作系统.所谓多进程,就是系统可以同时运行多个任务.例如我们的电脑上运行着 QQ.浏览器.音乐播放器.影音播放器等. ...
- 《Python分布式计算》第2章 异步编程 (Distributed Computing with Python)
序言 第1章 并行和分布式计算介绍 第2章 异步编程 第3章 Python的并行计算 第4章 Celery分布式应用 第5章 云平台部署Python 第6章 超级计算机群使用Python 第7章 测试 ...
最新文章
- centos7安装配置pgAgent
- 尘埃落定!苹果 10 亿美元入局 5G,Intel 挥别 9 年基带业务
- python列表元素赋值_如何在python中的列表列表的所有元素上执行“一行”赋值
- 怎样格式化电脑_160G移动硬盘做PE启动盘 要怎样做
- C#——事件(Event)DEMO[闻鸡起舞]
- win10系统U盘启动
- JavaScript使用技巧精萃 经典代码收藏版
- php自动下载 linux,Linux下软件、PHP和Perl的模块等都实现了自动安装
- iOS开发总结——项目目录结构
- 旋转的描述【1】——方向余弦矩阵
- 全网稀缺,完整链家地图找房的实现(一)
- 如何设置局域网内的固定IP地址?
- 深入浅出Yolo系列之Yolov5核心基础知识完整讲解
- TKinter —— GUI in python 4. Handing User Event 小组件 赋功能 (概念 必看!)
- 台式计算机启动时 每次按f1,开机按f1的解决方法_电脑开机每次都要按F1,怎么解决...
- 如何保养笔记本的电池
- Pandas+Numpy 数据中空值的处理操作:判断、查找、填充及删除
- Remix 搭建与简单使用
- android项目实战博学谷百度云,Android项目实战系列—基于博学谷(七)课程模块(下)...
- 文件服务器建立,文件服务器建立
热门文章
- zip压缩文件暴力破解
- OpenSplice DDS 分布式DDS网络架构(DDS 6.9.0+VS 2013+Qt 5.8.0 )
- 郁闷,IT厂商认证考试没有通过!
- Reader entry: ���� 乱码
- 欢迎来到,数据库联盟!
- Linux企业级项目实践之网络爬虫(29)——遵守robots.txt
- C#中使用DLL文件
- springmvc spring mybatis结合 - 代码共享
- Bailian2946 玩游戏【模拟】
- ZOJ1151 Word Reversal(没法提交)