2017-07-07 77 views
5

我有一个Python discord bot,它是用discord.py构建的,意思是整个程序在事件循环中运行。在循环结束前收集python协同程序的结果

我正在处理的函数涉及制作数百个HTTP请求并将结果添加到最终列表中。大约需要两分钟才能完成这些操作,所以我使用aiohttp使它们异步。我的代码的相关部分与aiohttp文档中的快速入门示例相同,但它引发了RuntimeError:会话已关闭。该方法取自“访问多个网址”下的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 

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

回答

4

在你链接的例子中,收集的结果是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) 
+0

哇!这完全滑了我的脑海。哈哈哈,你可以说出我对异步的新感觉。感谢您的快速帮助! – user3896248