asyncio + aiohttp协程异步并发示例

1、简单示例

import asyncio
from aiohttp import ClientSession,TCPConnector
import time

async def aiohttp_get(page):
    url = 'https://www.baidu.com/s?wd={}'.format(page)
    try:
        conn = TCPConnector(limit=10)  # 限制同时链接数,连接默认是100,limit=0 无限制
        async with ClientSession(connector=conn) as session:
                async with session.get(url,timeout=3) as response:
                    if response.status==200:
                        html = await response.text()
                        return {'url':url,'html':html}
                    else:
                        return {'url':url,'http_status':response.status}
    except Exception as err:
        print('Request error:',err)
        return None

def parse(task):
    print('返回值:',task.result())

async def main():
    tasks = []
    for i in range(10):
        task = asyncio.create_task(aiohttp_get(i))
        task.add_done_callback(parse)  # 异步获取返回值并输出给回调函数处理
        tasks.append(task)
    await asyncio.gather(*tasks)

if __name__ == '__main__':
    start = time.time()
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
    print(time.time()-start)
    print('程序结束')

2、设置回调函数参数

from functools import partial

def parse2(page,task):
    print('Page:',page,',返回值:',task.result())

async def main():
    tasks = []
    for i in range(10):
        task = asyncio.create_task(aiohttp_get(i))
        task.add_done_callback(partial(parse2,i))  # 设置回调函数参数
        tasks.append(task)
    await asyncio.gather(*tasks)

3、等待所有返回值后再输出

async def main():
    tasks = [aiohttp_get(i) for i in range(10)]
    results = await asyncio.gather(*tasks)
    print('结果已全部返回!')
    for result in results:
        print(len(result))

4、输出结果

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JOSON.

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值