RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 892450
Accepted
garrythehotdog
garrythehotdog
Asked:2020-10-13 05:18:27 +0000 UTC2020-10-13 05:18:27 +0000 UTC 2020-10-13 05:18:27 +0000 UTC

异步,aiohttp。运行执行多个请求的多个会话。问题关闭会话

  • 772

一个任务

有必要启动几个会话并让每个会话执行一定数量的请求。我想指出,有必要有几个会话,而不仅仅是一个,正如几乎所有 aiohttp 示例中所展示的那样。下面是其中的代码:

  1. 通过循环运行 curutina运行
  2. 在运行中创建了 3 个会话,并且将创建的会话和加载列表转移到相同数量的任务 ( runfetchers ) 中
  3. 每个runfetchers每个会话运行 20 次提取。
  4. 下载后,应将所有结果收集在一个地方,并关闭打开的会话。

问题

  1. 我刚开始了解 asyncio \ aiohttp ,也许我想错了,请纠正我。
  2. 代码正在运行,但是在关闭打开的会话时发生错误(因为我还没有尝试过)

在此之前,我尝试通过一个会话完成所有操作,并且一切正常,因为我使用了使用上下文管理器的示例中的代码,它本身关闭了会话,并且在示例中使用了一层“沉浸式” .

编码

import asyncio
import aiohttp
import math

# генератор который будет разрезать списки
def listpartial(inlist, n):
    if n > 0:
        s = math.ceil(len(inlist) / n)
        for q in range(s):
            yield inlist[q * n:(q + 1) * n]

# собсвенно загрузчик страниц
async def fetch(num, session):
    try:
        url = f'https://en.wikipedia.org/wiki/{num}'
        async with session.get(url) as r:
            await asyncio.sleep(0.1, 0.3)
            return await r.text(encoding='utf-8')
    except Exception as e:
        print('fetch', e)
        return ''

async def runfetchers(numlist, session):
    tasks2 = []
    # создам количество задач на загрузку каждого элемента
    for num in numlist:
        task = asyncio.ensure_future(fetch(num, session))
        tasks2.append(task)

    responses = await asyncio.gather(*tasks2)
    return responses

async def run(allnums):
    tasks = []
    sessions = []
    # получии объект генератор который будет выдавать списки по 20 элементов
    numlist = listpartial(allnums, 20)
    # создам 3 сессии и столько же задач и запущу их
    for _ in range(3):
        session = aiohttp.ClientSession()
        sessions.append(session)
        task = asyncio.ensure_future(runfetchers(next(numlist), session))
        tasks.append(task)

    responses = await asyncio.gather(*tasks)
    # закрываю открытые сессии
    # ?????? как закрыть вот эти сессии
    # for i in sessions:
    #     sessions[i].close()
    return responses

if __name__ == '__main__':
    nums = [x for x in range(1200)]

    loop = asyncio.get_event_loop()
    future = asyncio.ensure_future(run(nums))
    res = loop.run_until_complete(future)

    print(res)

结论

下面给出了我的问题的答案(再次感谢),但同时我编写了一个以不同方式解决我的问题的代码,也许它对某人会派上用场:

# собсвенно загрузчик страниц
async def fetch(num, session):
    try:
        url = f'https://en.wikipedia.org/wiki/{num}'
        async with session.get(url) as r:
            await asyncio.sleep(0.1, 0.3)
            return await r.text(encoding='utf-8')
    except Exception as e:
        print('fetch', e)
        return ''

# запустим сессию, которая запустит несколько запросов
# и потом сама себя закроет
async def start_sesssion(numlst):
    async with aiohttp.ClientSession() as session:
        futs = [asyncio.create_task(fetch(n, session)) for n in numlst]
        return await asyncio.gather(*futs)

if __name__ == '__main__':
    nums = [x for x in range(1200)]

    numlist = listpartial(nums, 20)

    loop = asyncio.get_event_loop()
    futures = [loop.create_task(start_sesssion(next(numlist))) for i in range(3)]
    result = loop.run_until_complete(asyncio.gather(*futures))

    print(result)
python
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Sergey Gornostaev
    2020-10-13T14:32:15Z2020-10-13T14:32:15Z

    ClientSession.close()是一个协程,所以

    for session in sessions:
        await session.close()
    

    或者

    await asyncio.wait([s.close() for s in sessions])
    
    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5