同步编程和异步编程区别(基于asyncio的异步)

发布时间 2023-05-29 00:10:56作者: 壮九

同步编程:用时大概4秒

import time

import requests
def download_image(url):
    print("开始下载:",url)
    # 发送网络请求,下载图片
    response = requests.get(url)
    print("下载完成")
    # 图片保存到本地文件
    file_name = url.rsplit('_')[-1]
    with open(file_name, mode='wb') as file_object:
        file_object.write(response.content)
if __name__ == '__main__':
    url_list = [
        'https://www3.autoimg.cn/newsdfs/g26/M02/35/A9/120x90_0_autohomecar__ChsEe12AXQ6AOOH_AAFocMs8nzU621.jpg',
        'https://www2.autoimg.cn/newsdfs/g30/M01/3C/E2/120x90_0_autohomecar__ChcCSV2BBICAUntfAADjJFd6800429.jpg',
        'https://www3.autoimg.cn/newsdfs/g26/M0B/3C/65/120x90_0_autohomecar__ChcCP12BFCmAIO83AAGq7vK0sGY193.jpg'
    ]
    start=time.time()
    for item in url_list:
        download_image(item)
    print(time.time()-start)

异步编程:用时小于0.5秒

import asyncio
import time
import aiohttp


async def download_image(url):
    async with aiohttp.ClientSession() as session:
        print("开始下载:", url)
        async with session.get(url) as response:
            # 发送网络请求,下载图片
            print("下载完成")
            # 图片保存到本地文件
            content = await response.content.read()
            file_name = url.rsplit('_')[-1]
            with open(file_name, mode='wb') as file_object:
                file_object.write(content)


async def main():
    url_list = [
        'https://www3.autoimg.cn/newsdfs/g26/M02/35/A9/120x90_0_autohomecar__ChsEe12AXQ6AOOH_AAFocMs8nzU621.jpg',
        'https://www2.autoimg.cn/newsdfs/g30/M01/3C/E2/120x90_0_autohomecar__ChcCSV2BBICAUntfAADjJFd6800429.jpg',
        'https://www3.autoimg.cn/newsdfs/g26/M0B/3C/65/120x90_0_autohomecar__ChcCP12BFCmAIO83AAGq7vK0sGY193.jpg'
    ]
    # 方法一:
    task = []
    for url in url_list:
        task.append(download_image(url))
    await asyncio.gather(*task)
    # 方法二:
    # tasks=[download_image(url) for url in url_list]
    # await asyncio.wait(tasks) #3.8版本后不支持该写法来,最好采用await asyncio.gather(*tasks)


if __name__ == '__main__':
    start = time.time()
    asyncio.run(main())
    print(time.time() - start)