1.协程概念
# 一般情况下,当程序处于IO操作时,线程会处于阻塞状态
# 协程:在单线程情况下,程序处于IO操作时,可以选择性地切换到其他任务上
# 协程在微观上看是任务之间的不停切换,切换条件一般就是IO操作;宏观上看是多个任务一起在执行。
# 总的来说就是多任务异步操作。
"""
假设有4个任务,采用单线程处理方式,每个任务有4个步骤,其中第二步和第四步是input操作和output操作,每个步骤需要1s,
若不采用协程,则一共需要16s才能完成所有任务。
若采用协程:
task1_step1 1s
task2_step1 1s 与此同时task1_step2也完成
task3_step1 1s 与此同时task2_step2也完成
task4_step1 1s 与此同时task3_step2也完成
task1_step3 1s 与此同时task4_step2也完成
task2_step3 1s 与此同时task1_step4也完成
task3_step3 1s 与此同时task2_step4也完成
task4_step3 1s 与此同时task3_step2也完成
task4_step4 1s
总耗时:9s
"""
❤️ 简单例子:
# 一般情况下,当程序处于IO操作时,线程会处于阻塞状态
# 协程:在单线程情况下,程序处于IO操作时,可以选择性地切换到其他任务上
# 协程在微观上看是任务之间的不停切换,切换条件一般就是IO操作;宏观上看是多个任务一起在执行。
# 总的来说就是多任务异步操作。
"""
假设有4个任务,采用单线程处理方式,每个任务有4个步骤,其中第二步和第四步是input操作和output操作,每个步骤需要1s,
若不采用协程,则一共需要16s才能完成所有任务。
若采用协程:
task1_step1 1s
task2_step1 1s 与此同时task1_step2也完成
task3_step1 1s 与此同时task2_step2也完成
task4_step1 1s 与此同时task3_step2也完成
task1_step3 1s 与此同时task4_step2也完成
task2_step3 1s 与此同时task1_step4也完成
task3_step3 1s 与此同时task2_step4也完成
task4_step3 1s 与此同时task3_step2也完成
task4_step4 1s
总耗时:9s
"""
import asyncio,time
async def download(url):
print('开始载入{}信息'.format(url))
await asyncio.sleep(2) # 模拟读取网页信息的过程
print('{}信息载入完成'.format(url))
async def main():
urls = [
'http://www.baidu.com',
'http://www.bilibili.com',
'http://www.music.163.com',
'http://www.csdn.com',
'http://www.tencent.com',
'http://www.wyb.com',
'http://www.xz.com'
]
tasks = []
for url in urls:
tasks.append(download(url))
await asyncio.wait(tasks)
if __name__ == '__main__':
start_time = time.time()
asyncio.run(main())
end_time = time.time()
print(end_time-start_time) #用时1.99s
"""
开始载入http://www.tencent.com信息
开始载入http://www.wyb.com信息
开始载入http://www.bilibili.com信息
开始载入http://www.music.163.com信息
开始载入http://www.baidu.com信息
开始载入http://www.xz.com信息
开始载入http://www.csdn.com信息
http://www.tencent.com信息载入完成
http://www.bilibili.com信息载入完成
http://www.xz.com信息载入完成
http://www.wyb.com信息载入完成
http://www.music.163.com信息载入完成
http://www.baidu.com信息载入完成
http://www.csdn.com信息载入完成
1.997464656829834
"""
对比同步(即传统方式):
import time
def download(url):
print('开始载入{}信息'.format(url))
time.sleep(2) # 模拟获取网页信息的过程
print('{}信息载入完成'.format(url))
if __name__ == '__main__':
start_time = time