在循环结束之前收集python协同程序的结果

时间:2017-07-07 22:39:55

标签: python asynchronous aiohttp

我有一个用discord.py构建的python discord bot,这意味着整个程序在一个事件循环中运行。

我正在处理的功能涉及发出数百个HTTP请求并将结果添加到最终列表中。按顺序执行这些操作大约需要两分钟,所以我使用aiohttp使它们异步。我的代码的相关部分与aiohttp文档中的quickstart示例相同,但它抛出了RuntimeError:Session已关闭。该方法取自https://pawelmhm.github.io/asyncio/python/aiohttp/2016/04/22/asyncio-aiohttp.html下的一个示例,即“获取多个网址”。

async def searchPostList(postUrls, searchString)
    futures = []
    async with aiohttp.ClientSession() as session:
        for url in postUrls:
            task = asyncio.ensure_future(searchPost(url,searchString,session))
            futures.append(task)

    return await asyncio.gather(*futures)


async def searchPost(url,searchString,session)):
    async with session.get(url) as response:
        page = await response.text()

    #Assorted verification and parsing
    Return data

我不知道为什么会出现这个错误,因为我的代码与两个可能的功能示例非常相似。事件循环本身工作正常。它永远运行,因为这是一个机器人应用程序。

1 个答案:

答案 0 :(得分:5)

在您关联的示例中,结果的收集在 async with块中。如果您在外面进行此操作,则无法保证会话在请求完成之前不会关闭!

在块中移动return语句应该有效:

async with aiohttp.ClientSession() as session:
        for url in postUrls:
            task = asyncio.ensure_future(searchPost(url,searchString,session))
            futures.append(task)

        return await asyncio.gather(*futures)