协程和线程的区别?
(1)相似点:都可以实现多任务,并发执行
(2)不同点:在实现多任务时, 线程切换从系统层面远不止保存和恢复 CPU上下文这么简单。 操作系统为了程序运行的高效性每个线程都有自己缓存Cache等等数据,操作系统还会帮你做这些数据的恢复操作。 所以线程的切换非常耗性能。但是协程的切换只是单纯的操作CPU的上下文,所以一秒钟切换个上百万次系统都抗的住。
import asyncio import time async def request(url): print('正在下载',url) #在异步协程中如果出现了同步模块相关的代码,那么就无法实现异步。 # time.sleep(2) #当在asyncio中遇到阻塞操作必须进行手动挂起 await asyncio.sleep(2) print('下载完毕',url) start = time.time() urls = [ 'www.baidu.com', 'www.sogou.com', 'www.ai8py.com' ] #任务列表:存放多个任务对象 stasks = [] for url in urls: c = request(url) task = asyncio.ensure_future(c) stasks.append(task) loop = asyncio.get_event_loop() #需要将任务列表封装到wait中 loop.run_until_complete(asyncio.wait(stasks)) print(time.time()-start)
import requests import asyncio import time start = time.time() urls = [ 'http://127.0.0.1:5000/bobo','http://127.0.0.1:5000/jay','http://127.0.0.1:5000/tom' ] async def get_page(url): print('正在下载',url) #requests.get是基于同步,必须使用基于异步的网络请求模块进行指定url的请求发送 #aiohttp:基于异步网络请求的模块 response = requests.get(url=url) print('下载完毕:',response.text) tasks = [] for url in urls: c = get_page(url) task = asyncio.ensure_future(c) tasks.append(task) loop = asyncio.get_event_loop() loop.run_until_complete(asyncio.wait(tasks)) end = time.time() print('总耗时:',end-start)