python异步编程之asyncio(百万并发)

https://www.cnblogs.com/shenh/p/9090586.html

import aiohttp
import asyncio
from aiohttp.client_exceptions import ClientOSError
from typing import *
import logging

logger = logging.getLogger(__name__)

class RequestBuilder(object):
    def __init__(self, method: str, url: str, **kwargs: Any):
        self.method = method
        self.url = url
        self.__dict__.update(kwargs)


async def fetch(func, **kwargs: Any) -> Any:
    async with aiohttp.ClientSession() as session:  # 协程嵌套,只需要处理最外层协程即可fetch_async
        try:
            async with session.request(**kwargs) as resp:
                await func(resp)
                # return await resp.read()
        except (ClientOSError, asyncio.TimeoutError) as e:
            logger.error(e)


async def bound_future(func, *request_builders: RequestBuilder) -> Any:
    async with asyncio.Semaphore(1000):
        return await asyncio.gather(
            *[asyncio.ensure_future(fetch(func, **builder.__dict__)) for builder in request_builders])


def async_request(func) -> Any:
    def decorator(event_loop: Any, *request_builders: RequestBuilder):
        return event_loop.run_until_complete(bound_future(func, *request_builders))

    return decorator

if __name__ == '__main__':
    event_loop = asyncio.get_event_loop()
    
    @async_request
    async def test(resp):
        c = await resp.read()
        print(c)
        
    url_list = []
    test(event_loop, *[RequestBuilder('GET', url) for url in url_list])
    event_loop.close()

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值