17简单的异步发送请求

 

import asyncio
import aiohttp
import time
import threading
# 异步利用await 阻塞,让协程跳出函数去执行其他方法

# 异步能高效地实现爬虫

def domain(number):
    start = time.time()

    # 声明协程函数
    async def get(url):
        # aiohttp 支持异步
        # 通过ClientSession 声明一个会话对象
        session = aiohttp.ClientSession()

        # 向目标网站发起请求,通过await字符修饰协程会跳出,让第二个(3,4,..n)协程执行上面的代码
        response = await session.get(url)
        # # 获取当前协程数
        # current_coroutines = len(asyncio.all_tasks(loop))
        # print(f"Current coroutines: {current_coroutines}")
        # 获取文本属于io密集型,await令协程让出cpu。
        # await response.text()

        # await令协程让出cpu,等待资源回收。
        await session.close()

        return response

    async def request():
        url = 'https://www.baidu.com'
        # 等待其返回响应时,await令cpu让出占用权
        await get(url)

    # 创建任务,通过asyncio.ensure_future注册协程函数
    tasks = [asyncio.ensure_future(request()) for _ in range(number)]

    # 创建事件循环器
    loop = asyncio.get_event_loop()

    # 把批量任务通过wait添加进事件循环器,单个任务是直接用tasks的,但单个任务添加不常用
    loop.run_until_complete(asyncio.wait(tasks))

    end = time.time()
    print(f"Number:{number},Cost time:{end-start}")

if __name__ == '__main__':
    for number in [100,200,500,700]:
        domain(number)

 

posted @ 2023-09-17 18:01  冷夜O  阅读(40)  评论(0)    收藏  举报