网站首页 > 技术文章 正文
前两章我们讲述了多进程、多线程并发编程相关,这章我们来学习下Python中的协程。
协程相比线程更轻量级,在编写网络相关程序时性能较好,能充分利用cpu,一个协程等待io时不会阻止其它协程的执行。
我们这里仍然以能说明问题为目的,不会把协程的方方面面都讲到,如果有问题欢迎评论交流。
假如我们需要下载10张图片,下载每张的时间是2秒,如果我们串行去下载,那下载完就至少需要20秒的时间,那如果用10个协程去下载呢?
如果我们用10个协程去下载,时间应该会远小于串行下载,约等于2秒。为了简单说明问题,这里我们不会真正去下载图片,我们用睡眠2秒来模拟下载任务,分别打印出下载前与下载后的时间。
一、用到的协程库
python中的协程主要由asyncio库封装,我们直接调用这个库来操作协程就可以了,另外还会用到两个语法糖:async、await
二、启动协程
启动协程有两种方式,一个是await coroutine,另一个是 asyncio.create_task,调用这两个中的其中一个就会执行协程的代码
三、实现代码
import asyncio
from datetime import datetime
async def sleep_and_print(co_id, seconds):
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
print(f"{now}: coroutine {co_id} start sleep")
await asyncio.sleep(seconds)
now = datetime.now().strftime("%Y-%m-%d %H:%m:%S")
print(f"{now}: coroutine {co_id} end sleep")
async def main():
await asyncio.gather(*[asyncio.create_task(sleep_and_print(i, 2)) for i in range(10)])
asyncio.run(main())
四、输出结果
2022-02-05 22:51:09: coroutine 0 start sleep
2022-02-05 22:51:09: coroutine 1 start sleep
2022-02-05 22:51:09: coroutine 2 start sleep
2022-02-05 22:51:09: coroutine 3 start sleep
2022-02-05 22:51:09: coroutine 4 start sleep
2022-02-05 22:51:09: coroutine 5 start sleep
2022-02-05 22:51:09: coroutine 6 start sleep
2022-02-05 22:51:09: coroutine 7 start sleep
2022-02-05 22:51:09: coroutine 8 start sleep
2022-02-05 22:51:09: coroutine 9 start sleep
2022-02-05 22:02:11: coroutine 0 end sleep
2022-02-05 22:02:11: coroutine 1 end sleep
2022-02-05 22:02:11: coroutine 2 end sleep
2022-02-05 22:02:11: coroutine 3 end sleep
2022-02-05 22:02:11: coroutine 4 end sleep
2022-02-05 22:02:11: coroutine 5 end sleep
2022-02-05 22:02:11: coroutine 6 end sleep
2022-02-05 22:02:11: coroutine 7 end sleep
2022-02-05 22:02:11: coroutine 8 end sleep
2022-02-05 22:02:11: coroutine 9 end sleep
从结果可以看出每个协程用了2秒,整体上的时间还是用了2秒,是不是很神奇!
猜你喜欢
- 2024-12-18 接口测试系列文章3——Python接口测试其实只需三步
- 2024-12-18 Python列表详解 python中列表的方法
- 2024-12-18 Python3+pygame实现的90坦克大战代码有演示效果
- 2024-12-18 python并发编程一:多进程 python 多进程原理
- 2024-12-18 小白都看懂了,Python 中的线程和进程精讲,建议收藏
- 2024-12-18 pandas每天一题-题目1、2、3 pandas选择题题库
- 2024-12-18 二分查找法-Python学习 二分查找算法流程图
- 2024-12-18 Python3.8+Django+nginx+uwsgi环境(二)
- 2024-12-18 一篇文章带你使用Python搞定对Excel表的读写和处理
- 2024-12-18 py2exe实现python文件打包为.exe可执行程序(上篇)
- 05-25Python 3.14 t-string 要来了,它与 f-string 有何不同?
- 05-25Python基础元素语法总结
- 05-25Python中的变量是什么东西?
- 05-25新手常见的python报错及解决方案
- 05-2511-Python变量
- 05-2510个每个人都是需要知道Python问题
- 05-25Python编程:轻松掌握函数定义、类型及其参数传递方式
- 05-25Python基础语法
- 257℃Python短文,Python中的嵌套条件语句(六)
- 257℃python笔记:for循环嵌套。end=""的作用,图形打印
- 256℃PythonNet:实现Python与.Net代码相互调用!
- 251℃Python操作Sqlserver数据库(多库同时异步执行:增删改查)
- 251℃Python实现字符串小写转大写并写入文件
- 106℃原来2025是完美的平方年,一起探索六种平方的算吧
- 90℃Python 和 JavaScript 终于联姻了!PythonMonkey 要火?
- 81℃Ollama v0.4.5-v0.4.7 更新集合:Ollama Python 库改进、新模型支持
- 最近发表
- 标签列表
-
- python中类 (31)
- python 迭代 (34)
- python 小写 (35)
- python怎么输出 (33)
- python 日志 (35)
- python语音 (31)
- python 工程师 (34)
- python3 安装 (31)
- python音乐 (31)
- 安卓 python (32)
- python 小游戏 (32)
- python 安卓 (31)
- python聚类 (34)
- python向量 (31)
- python大全 (31)
- python次方 (33)
- python桌面 (32)
- python总结 (34)
- python浏览器 (32)
- python 请求 (32)
- python 前端 (32)
- python验证码 (33)
- python 题目 (32)
- python 文件写 (33)
- python中的用法 (32)