协程-应用

# request.get() 同步的代码 -> 异步操作aiohttp

import os
# 异步io
import asyncio
# 异步file
import aiofiles
# 异步 http
import aiohttp

# 如果文件夹不存在则创建文件夹,用来放图片
if not os.path.exists("other/tupian"):
    os.mkdir("other/tupian")

urls = [
    'http://pic.bizhi360.com/litimg/11537.jpg',
    'http://pic.bizhi360.com/litimg/11508.jpg',
    'http://pic.bizhi360.com/litimg/11469.jpg'
]


# url = 'http://pic.bizhi360.com/litimg/11537.jpg'
# name = url.rsplit("/", 1)[-1]
# print(name)

async def aiodownload(url):
    # 发起请求
    # 得到图片内容
    # 保存到文件
    name = url.rsplit("/", 1)[-1]  # 切片,总共切了一次,选了最后一个位置,得到内容
    # "http://pic.bizhi360.com/litimg","11537.jpg"
    # async with aiohttp.ClientSession() as session 为异步上下文管理器,在请求结束时或者发生异常请求时支持自动关闭实例化的客户端会话。
    async with aiohttp.ClientSession() as session:  # request
        async with session.get(url) as resp:  # resp = request.get()
            # 请求回来了,写入文件
            # 异步写入
            async with aiofiles.open('./other/tupian/' + name, "wb") as fp:
                # await 等待。 等待它写完
                # await 只能在带有 async 关键字的函数中运行。
                await fp.write(await resp.content.read())

    print(name, "下载成功!!!")


async def main():
    tasks = []
    for url in urls:
        # 会报弃用警告:从 Python 3.8 开始,不推荐使用 asyncio.wait() 显式传递协程对象,
        # 并计划在 Python 3.11 中删除。await asyncio.wait(tasks)
        # tasks.append(aiodownload(url))

        # create_task 创建任务
        tasks.append(asyncio.create_task(aiodownload(url)))
    # print(tasks)
    await asyncio.wait(tasks)


if __name__ == '__main__':
    asyncio.run(main())

 

posted @ 2023-03-03 23:09  0x1e61  阅读(10)  评论(0编辑  收藏  举报