协程处理下载任务

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值