本文基于python3 asyncio, aiohttp
    首先要声明一个点,python中创建的async协程函数无法直接运行,必须要添加到loop循环时间中才能运行。
    一般采用两种方式运行协程函数
    _

    1. 1
    2. import asyncio
    3. loop = asyncio.get_event_loop()
    4. tasks = [asyncio.create_task( 此处放入协程函数)] # 创建协程事件
    5. loop.run_until_complete(asyncio.wait(tasks))
    6. # 如果你的tasks是个列表,run_until_complete中需要添加asyncio.wait,
    7. # 如果是单个协程对象 比如上方例子中的 async def main()
    8. # 可以省略 tasks = ...步骤 直接写 loop.run_until_complete(main())
    9. 2:
    10. 不创建事件循环 直接使用 asyncio.run() 逻辑与例1一致
    11. 其他的一些注意事项可以百度搜一搜


    _
    首先创建一个单例模式的异步请求类

    1. from aiohttp import ClientSession, TCPConnector
    2. import asyncio
    3. class CS:
    4. # 实现单例模式
    5. def __new__(cls, *args, **kwargs):
    6. if not hasattr(CS, '_single'):
    7. CS._single = object.__new__(cls)
    8. return CS._single
    9. # 创建一个异步请求类session, connector=TCPConnector(ssl=False)等同于requests.post(verify=False)
    10. # 跳过证书验证
    11. def __init__(self, headers=None):
    12. self._cs = ClientSession(connector=TCPConnector(ssl=False), headers=headers)
    13. # 添加请求头
    14. def add_headers(self, headers):
    15. self._cs._prepare_headers(headers)
    16. # 不建议在类内写逻辑, 比如什么获取token之类的,尽量减少耦合度
    17. async def post(self, url, **kwargs):
    18. async with self._cs.post(url, **kwargs) as resp:
    19. return await resp.json()
    20. async def get(self, url, **kwargs):
    21. async with self._cs.get(url, **kwargs) as resp:
    22. return await resp.json()
    23. async def close(self):
    24. await self._cs.close()
    25. async def main():
    26. cs = CS()
    27. # 获取token
    28. response = await cs.get(url, params)
    29. token = response['token']
    30. # 将token写入请求头
    31. cs.add_headers({'token': token})
    32. result = await cs.post(url, json)
    33. await cs.close()
    34. return result
    35. asyncio.run(main())

    后续添加协程函数时, 不可使用同一个类中的self.post(),self.get()之类的方法。因为在init的时候
    已经创建了一个session, 直接使用self.post()将会导致创建两个session接着报错。
    在调用完协程函数后记得close()
    self.post(),self.get()是在实例化后,类内没有满足需求时还需要去请求其他接口时使用。此时可以保证用的是同一个session
    例子:
    async def main(): #非类内
    cs = CS(headers={‘x-stream-id’: get_x_stream_id()}
    response = await cs.post(url=url, json=json) # post方法内已经将返回的response转化成json了
    cs.close() # 必须关闭
    return response