这里的异步是指“不等待IO执行结果”
协程
1、 什么是协程:协程是线程的更小切分,又称为“微线程”,是一种用户态的轻量级线程。
2、协程的优缺点:
优点:
- 无需线程上下文切换的开销,协程避免了无意义的调度,由此可以提高性能(但也因此,程序员必须自己承担调度的责任,同时,协程也失去了标准线程使用多CPU的能力)
- 无需原子操作锁定及同步的开销
- 方便切换控制流,简化编程模型
- 高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。所以很适合用于高并发处理。
缺点:
- 无法利用多核资源:协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上,协程需要和进程配合才能运行在多CPU上.当然我们日常所编写的绝大部分应用都没有这个必要,除非是cpu密集型应用。
- 进行阻塞(Blocking)操作(如IO时)会阻塞掉整个程序
相关了解:
- event_loop:事件循环,相当于一个无限循环,可以挂起一些函数,当满足条件时,函数可以被循环执行
- coroutine:协程对象
- task:任务
- future:代表将来或还没有执行的任务,也相当于一个task
- async:定义了一个协程
- await:用来挂起阻塞方法
基本操作:
- 导入asyncio模块:import asyncio
- async关键字:使用此关键字返回一个协程对象
async def coroutine():
print("I'm a coroutine")
coroutine_object = coroutine() # coroutine_object是一个协程对象
- 创建事件循环对象:loop = asyncio.get_event_loo()
- 将协程对象注册到事件循环对象中:loop.run_until_complete(coroutine_object)、此时协程对象直接开始执行
- 生成任务对象:
1)、使用事件循环对象生成任务对象task
loop = asyncio.get_event_loop()
# 基于loop创建任务对象
task = loop.create_task(coroutine_object)
# 将任务对象注册到循环事件对象中
loop.run_until_complete(task)
2)、使用future对象创建任务对象
loop = asyncio.get_event_loop()
# 使用future创建任务对象
task = asyncio.ensure_future(coroutine_object)
# 将任务对象注册到事件循环对象中
loop.run_until_complete(task)
4.绑定回调函数:task.add_done_callback(回调函数名)
多任务异步协程实现代码示例:
import asyncio
import time
# 程序开始时间
start_time = time.time()
url_list = [
'www.baidu.com',
'www.goubanjia.com',
'www.sougou.com'
]
# 使用async定义一个函数
async def requests(url):
print("开始", url)
# 如果在异步协程中出现同步模块相关代码,则无法实现异步
# time.sleep(2)
# 在async中若果出现阻塞操作,必须手动挂起
await asyncio.sleep(2)
print("结束", url)
# 创建任务列表,可以存储多个任务对象
task_list = []
# 创建任务对象,将任务对象添加到任务列表中
for url in url_list:
c = requests(url)
task = asyncio.ensure_future(c)
task_list.append(task)
# 创建事件循环对象
loop = asyncio.get_event_loop()
"""
将任务列表注册到loop对象中
在此之前需将任务列表封装到wait中,此为标准写法
"""
loop.run_until_complete(asyncio.wait(task_list))
# 程序结束时间
end_time = time.time()
# 程序运行时间
print(start_time - end_time)
开始 www.baidu.com
开始 www.goubanjia.com
开始 www.sougou.com
结束 www.baidu.com
结束 www.goubanjia.com
结束 www.sougou.com
-2.0204954147338867
来源:CSDN
作者:大千1999
链接:https://blog.csdn.net/qq_44728901/article/details/104113912