修改例程flags_asyncio.py使能在python311环境下运行

先贴上修改后的例程:
import asyncio
import aiohttp
import time
from flags import BASE_URL, save_flag, show, POP20_CC


async def get_flag(cc):
    async with aiohttp.ClientSession() as session:
        url = '{}/{cc}/{cc}.gif'.format(BASE_URL, cc=cc.lower())
        async with session.get(url) as response:
            image = await response.read()
            return image


async def download_one(cc):
    image = await get_flag(cc)
    show(cc)
    save_flag(image, cc.lower() + '.gif')
    return cc


async def download_many(cc_list):
    # loop = asyncio.new_event_loop()
    tasks = [asyncio.create_task(download_one(cc)) for cc in cc_list]
    wait_coro, pending = await asyncio.wait(tasks)
    # res = loop.run_until_complete(wait_coro)
    # loop.close()
    return len(wait_coro)


def main(download_many, cc_list):
    t0 = time.time()
    count = asyncio.run(download_many(cc_list))
    elapsed = time.time() - t0
    msg = '\n{} flags downloaded in {:.2f}s'
    print(msg.format(count, elapsed))


if __name__ == '__main__':
    main(download_many, POP20_CC)

修改之处主要有三处:
1,在get_flag函数内使用
async with aiohttp.ClientSession() as session:
    async with session.get(url) as response:
替换原来的:
yield from aiohttp.request('GET', url)
2,在download_many函数内弃用loop,直接用asyncio.create_task生成Future迭代器传给asyncio.wait函数
3,在main函数里使用asyncio.run函数调用download_many函数

最后贴上例程运行输出:
C:\Users\fange\Scripts\python.exe D:\fluentPy\chapter17_18\flags_asyncio.py 
IN CN BR PK US ET VN BD CD FR JP DE PH ID EG NG RU IR TR MX 
20 flags downloaded in 10.55s

进程已结束,退出代码为 0
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值