本文是写给 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 异步编程入门相关推荐

  1. python异步编程视频_asyncio异步编程【含视频教程】

    Python Python开发 Python语言 asyncio异步编程[含视频教程] 不知道你是否发现,身边聊异步的人越来越多了,比如:FastAPI.Tornado.Sanic.Django 3. ...

  2. python协程和异步编程

    文章目录 协程 & 异步编程(asyncio) 1. 协程的实现 1.1 greenlet 1.2 yield 1.3 asyncio 1.4 async & awit 1.5 小结 ...

  3. 【转】1.6异步编程:IAsyncResult异步编程模型 (APM)

    传送门:异步编程系列目录-- 大部分开发人员,在开发多线程应用程序时,都是使用ThreadPool的QueueUserWorkItem方法来发起一次简单的异步操作.然而,这个技术存在许多限制.最大的问 ...

  4. 异步编程-线程实现异步编程

    异步编程-线程实现异步编程 使用线程实现异步 第一种方式 第二种方式 问题 在日常开发中我们经常会遇到这样的情况,即需要异步地处理一些事情,而不需要知道异步任务的结果.比如在调用线程里面异步打日志,为 ...

  5. 【学习笔记】Part1·JavaScript·深度剖析-函数式编程与 JS 异步编程、手写 Promise(二、JavaScript 异步编程)

    [学习笔记]Part1·JavaScript·深度剖析-函数式编程与 JS 异步编程.手写 Promise(课前准备) [学习笔记]Part1·JavaScript·深度剖析-函数式编程与 JS 异步 ...

  6. promise 浏览器实现的源码_【大前端01-01】函数式编程与JS异步编程、手写Promise...

    [简答题]一.谈谈你是如何理解JS异步编程的,EventLoop.消息队列都是做什么的,什么是宏任务.什么是微任务? 如何理解JS异步编程 众所周知JavaScript语言执行环境是"单线程 ...

  7. python asyncio_Python 中的异步编程:Asyncio

    异步和同步的代码对比 现在我们实际验证异步模式的切实有效,我会比较两段 python 脚本,这两个脚本除了sleep方法外,其余部分完全相同.在第一个脚本里,我会用标准的 time.sleep 方法, ...

  8. python协程编程实例_Python异步编程之协程任务的调度操作实例分析

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  9. python 多线程和协程结合_Python 异步编程,看这门课就够了~

    我们常见的 Linux.Windows.Mac OS 操作系统,都是支持多进程的多核操作系统.所谓多进程,就是系统可以同时运行多个任务.例如我们的电脑上运行着 QQ.浏览器.音乐播放器.影音播放器等. ...

  10. 《Python分布式计算》第2章 异步编程 (Distributed Computing with Python)

    序言 第1章 并行和分布式计算介绍 第2章 异步编程 第3章 Python的并行计算 第4章 Celery分布式应用 第5章 云平台部署Python 第6章 超级计算机群使用Python 第7章 测试 ...

最新文章

  1. centos7安装配置pgAgent
  2. 尘埃落定!苹果 10 亿美元入局 5G,Intel 挥别 9 年基带业务
  3. python列表元素赋值_如何在python中的列表列表的所有元素上执行“一行”赋值
  4. 怎样格式化电脑_160G移动硬盘做PE启动盘 要怎样做
  5. C#——事件(Event)DEMO[闻鸡起舞]
  6. win10系统U盘启动
  7. JavaScript使用技巧精萃 经典代码收藏版
  8. php自动下载 linux,Linux下软件、PHP和Perl的模块等都实现了自动安装
  9. iOS开发总结——项目目录结构
  10. 旋转的描述【1】——方向余弦矩阵
  11. 全网稀缺,完整链家地图找房的实现(一)
  12. 如何设置局域网内的固定IP地址?
  13. 深入浅出Yolo系列之Yolov5核心基础知识完整讲解
  14. TKinter —— GUI in python  4. Handing User Event 小组件 赋功能 (概念 必看!)
  15. 台式计算机启动时 每次按f1,开机按f1的解决方法_电脑开机每次都要按F1,怎么解决...
  16. 如何保养笔记本的电池
  17. Pandas+Numpy 数据中空值的处理操作:判断、查找、填充及删除
  18. Remix 搭建与简单使用
  19. android项目实战博学谷百度云,Android项目实战系列—基于博学谷(七)课程模块(下)...
  20. 文件服务器建立,文件服务器建立

热门文章

  1. zip压缩文件暴力破解
  2. OpenSplice DDS 分布式DDS网络架构(DDS 6.9.0+VS 2013+Qt 5.8.0 )
  3. 郁闷,IT厂商认证考试没有通过!
  4. Reader entry: ���� 乱码
  5. 欢迎来到,数据库联盟!
  6. Linux企业级项目实践之网络爬虫(29)——遵守robots.txt
  7. C#中使用DLL文件
  8. springmvc spring mybatis结合 - 代码共享
  9. Bailian2946 玩游戏【模拟】
  10. ZOJ1151 Word Reversal(没法提交)