协程、asyncio、异步编程
文章目录
- 1 协程
- 2 异步编程
- 3.1 事件循环
- 3.2 async
- 3.3 await
- 3.4 Task对象
1 协程
协程不是由操作系统提供,由程序员人为提供(用户态上下文切换技术)
协称(Coroutine),也可以被称为微线程,是一种用户态内的上下文切换技术。简而言之,其实就是通过一个线程实现代码块相互切换执行。
实现协程的几种方法:
- greenlet、早期模块
- yield关键字
- asynco装饰器(py3.4)
- async、await关键字(py3.5)(推荐)
协程意义
在一个线程中,如果遇到IO等待时间,线程不会等,利用空闲的时间在去干其他事。
2 异步编程
3.1 事件循环
理解微一个死循环,去检测并执行某些代码
import asyncio# 生成或获取一个事件循环
loop = asyncio.get_event_loop()# 将任务放到 任务列表
loop.run_until_complete(任务)
3.2 async
协程函数:定义函数的时候async def 函数名
协程对象:执行协程函数()得到协程对象
# 协程对象
async def func():pass # 内容不执行# 协程对象
result = func()
注意:执行协程函数创建爱协程对象,函数内部代码不会执行
事件循环处理函数内部代码
import asyncio# 协程对象
async def func():pass # 内容不执行# 协程对象
result = func()# 添加事件,帮助执行函数内部代码 py3.4
#loop = asyncio.get_event_loop()
#loop.run_until_complete(result)# py3.7
asycio.run(result)
3.3 await
await + 可等待对象(协程对象、Future、Task)
await就是等待对象的值得到结果之后在继续往下走
案例一:
import asyncioasync def func():print("666")# 这里等待2秒,有其他任务执行其他任务,然后继续向后执行res = await asyncio.sleep(2)print("结束", res)asyncio.run(func())
案例二:
import asyncioasync def others():print("start")await asyncio.sleep(2)print("end")return "返回值"async def func():print("执行协程函数内部代码")# 遇到IO操作挂起当前协程(任务),等IO操作完成之后再继续往下执行。# 当前协程挂起时,事件循环可以去执行其他协程(任务)res = await others()print("IO请求结束,结果为:", res)asyncio.run(func())
案例三
import asyncioasync def others():print("start")await asyncio.sleep(2)print("end")return "返回值"async def func():print("执行协程函数内部代码")# 遇到IO操作挂起当前协程(任务),等IO操作完成之后再继续往下执行。# 当前协程挂起时,事件循环可以去执行其他协程(任务)res1 = await others()print("IO请求结束,结果为:", res1)res2 = await others()print("IO请求结束,结果为:", res2)asyncio.run(func())
3.4 Task对象
py3.7
在事件循环中添加多个任务
Task用于并发调度协程,通过
asyncio.create_task(协程对象)
的方式创建爱你Task对象,这样可以让协程加入事件循环中等待被调度执行。除了使用asyncio.create_task()
函数以外,还可以用更低层级的loop_create_task()
或ensure_future()
函数。不建议手动实例化Task对象。
参考地址:
https://www.bilibili.com/video/BV1dD4y127bD
协程、asyncio、异步编程相关推荐
- python3异步编程_协程 Python异步编程(asyncio)
协程(Coroutine) 也可以被称为微线程,是一种用户态内的上下文切换技术.简而言之,其实就是通过一个线程实现代码块相互切换执行. 直接上代码,例如: 同步编程 import time def f ...
- python协程和异步编程
文章目录 协程 & 异步编程(asyncio) 1. 协程的实现 1.1 greenlet 1.2 yield 1.3 asyncio 1.4 async & awit 1.5 小结 ...
- python——asyncio模块实现协程、异步编程(一)
我们都知道,现在的服务器开发对于IO调度的优先级控制权已经不再依靠系统,都希望采用协程的方式实现高效的并发任务,如js.lua等在异步协程方面都做的很强大. python在3.4版本也加入了协程的概念 ...
- python——asyncio模块实现协程、异步编程(三)
[八]协程停止 future对象有几个状态: Pending Running Done Cancelled 创建future的时候,task为pending,事件循环调用执行的时候当然就是runnin ...
- python——asyncio模块实现协程、异步编程(二)
[六]协程并发 定义tasks时可以设置多个ensure,也可以像多线程那样用append方法实现 tasks = [asyncio.ensure_future(coroutine1),asyncio ...
- java8 协程_Java8 异步编程—CompletableFuture
Java 为并发编程提供了众多的工具,本文将重点介绍 Java8 中 CompletableFuture. 笔者在自己搜索资料及实践之后,避开已经存在的优秀文章的写作内容与思路,将以更加浅显的示例和语 ...
- python并发编程:协程asyncio、多线程threading、多进程multiprocessing
python并发编程:协程.多线程.多进程 CPU密集型计算与IO密集型计算 多线程.多进程与协程的对比 多线程 创建多线程的方法 多线程实现的生产者-消费者爬虫 Lock解决线程安全问题 使用线程池 ...
- python3异步协程爬虫_Python实现基于协程的异步爬虫
Python实现基于协程的异步爬虫 一.课程介绍 1. 课程来源 本课程核心部分来自<500 lines or less>项目,作者是来自 MongoDB 的工程师 A. Jesse Ji ...
- python异步爬虫_Python实现基于协程的异步爬虫
Python实现基于协程的异步爬虫 一.课程介绍 1. 课程来源 本课程核心部分来自<500 lines or less>项目,作者是来自 MongoDB 的工程师 A. Jesse Ji ...
- python asyncio 异步编程-协程 2
asyncio 异步编程 官方文档: 中文版:https://docs.python.org/zh-cn/3.8/library/asyncio.html 英文本:https://docs.pytho ...
最新文章
- [Android编程心得] Camera(OpenCV)自动对焦和触摸对焦的实现
- Ctrl+E快捷键,一键批量解决Excel中90%的问题!
- 求均值方差_协方差,方差,标准差
- 渗透知识-XSS跨站脚本攻击
- 修改zabbix后台登录账号和密码,提升为超级管理员
- CS224n笔记二:word2vec
- java lamda循环条件_Java lambda 循环累加求和代码
- cxf客户端访问方式
- 【Linux】一步一步学Linux——hexdump命令(267)
- Hello, AnnsShadow!
- 有一说一,确实。。 | 今日最佳
- Shiro框架原理及应用分析
- 又一尴尬问题!不少用户反馈iPhone 12屏幕特别“黄”
- Python+Selenium FAQ
- python数据挖掘orange
- 简历编写技巧-java开发工程师简历实战
- 8片74151扩展为64选1数据选择器
- 数据分析方法论和数据分析方法
- Android 点击键盘外 非输入框 关闭软键盘
- 建行手机银行4.0版本转账怎么不要求输入支付密码?