python asyncio并发编程(1)
2020-01-07 本文已影响0人
TheRightPath1
1.asyncio模块的功能介绍
(1) 包含各种特定系统实现的模块化事件循环
(2) 传输和协议抽象
(3) 对TCP、UDP、SSL子进程、延时调用以及其他的具体支持
(4) 模仿futures模块但适用于事件循环使用的Future类
(5) 基于yield from的协议和任务,可以让你用顺序的方式编写并发代码
(6) 必须使用一个将产生阻塞IO的调用时, 有接口可以把这个事件转移到线程池
(7) 模仿threading模块中的同步原语、可以用在单线程内的协程之间
2.案例代码:
协程的编码模式离不开三个要素
1.事件循环 2. 回调(驱动生成器) 3.epoll(IO多路复用)
协程框架使用最多的:tornado、gevent、twisted (scrapy,django channels)
import asyncio
import time
async def get_url(url):
print('start get url')
# 如果此处写成await time.sleep(2),那么会报NoneType object错误,因为await后面必须跟协程对象
# 如果此处写成time.sleep(2),那么整个函数会变成一个顺序执行过程, 每个程序都会阻塞2秒
await asyncio.sleep(2)
print('end get url')
if __name__ == '__main__':
start = time.time()
# 生成协程运行必须的事件循环
loop = asyncio.get_event_loop()
# 生成协程运行的十个任务
task = [get_url('www.baidu.com') for i in range(10)]
# run_until_complete用来运行协程任务,如果是单个任务直接传入任务函数,
# 多个任务使用asyncio.wait()方法传入一个可迭代的对象
loop.run_until_complete(asyncio.wait(task))
end = time.time()
print(end-start)
运行结果:
start get url
start get url
start get url
start get url
start get url
start get url
start get url
start get url
start get url
start get url
end get url
end get url
end get url
end get url
end get url
end get url
end get url
end get url
end get url
end get url
2.004849910736084