Python3 异步协程基础

不羁岁月 提交于 2020-01-31 00:18:51

这里的异步是指“不等待IO执行结果”

协程

1、 什么是协程:协程是线程的更小切分,又称为“微线程”,是一种用户态的轻量级线程。
2、协程的优缺点
优点:

  1. 无需线程上下文切换的开销,协程避免了无意义的调度,由此可以提高性能(但也因此,程序员必须自己承担调度的责任,同时,协程也失去了标准线程使用多CPU的能力)
  2. 无需原子操作锁定及同步的开销
  3. 方便切换控制流,简化编程模型
  4. 高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。所以很适合用于高并发处理。

缺点:

  1. 无法利用多核资源:协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上,协程需要和进程配合才能运行在多CPU上.当然我们日常所编写的绝大部分应用都没有这个必要,除非是cpu密集型应用。
  2. 进行阻塞(Blocking)操作(如IO时)会阻塞掉整个程序

相关了解:

  • event_loop:事件循环,相当于一个无限循环,可以挂起一些函数,当满足条件时,函数可以被循环执行
  • coroutine:协程对象
  • task:任务
  • future:代表将来或还没有执行的任务,也相当于一个task
  • async:定义了一个协程
  • await:用来挂起阻塞方法

基本操作:

  1. 导入asyncio模块:import asyncio
  2. async关键字:使用此关键字返回一个协程对象
async def coroutine():
	print("I'm a coroutine")
coroutine_object = coroutine() # coroutine_object是一个协程对象
  1. 创建事件循环对象:loop = asyncio.get_event_loo()
  2. 将协程对象注册到事件循环对象中:loop.run_until_complete(coroutine_object)、此时协程对象直接开始执行
  3. 生成任务对象:
    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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!