以字符串形式获取 aiohttp 结果
Get aiohttp results as string
我正尝试在 python 中使用异步从网站获取数据。作为示例,我使用了这段代码(在 A Better Coroutine Example 下):https://www.blog.pythonlibrary.org/2016/07/26/python-3-an-intro-to-asyncio/
现在这工作正常,但它将二进制块写入文件,我不希望它在文件中。我想要直接生成的数据。但是我目前有一个协程对象列表,我无法从中获取数据。
代码:
# -*- coding: utf-8 -*-
import aiohttp
import asyncio
import async_timeout
async def fetch(session, url):
with async_timeout.timeout(10):
async with session.get(url) as response:
return await response.text()
async def main(loop, urls):
async with aiohttp.ClientSession(loop=loop) as session:
tasks = [fetch(session, url) for url in urls]
await asyncio.gather(*tasks)
return tasks
# time normal way of retrieval
if __name__ == '__main__':
urls = [a list of urls..]
loop = asyncio.get_event_loop()
details_async = loop.run_until_complete(main(loop, urls))
谢谢
问题出在main()
末尾的return tasks
,原文中没有。而不是 returning 协程对象(一旦传递给 asyncio.gather
就没有用了),你应该 returning 由 asyncio.gather
编辑的元组 return,其中包含 运行 正确顺序的协同程序的结果。例如:
async def main(loop, urls):
async with aiohttp.ClientSession(loop=loop) as session:
tasks = [fetch(session, url) for url in urls]
results = await asyncio.gather(*tasks)
return results
现在 loop.run_until_complete(main(loop, urls))
将 return 一个与 URL 顺序相同的文本元组。
我正尝试在 python 中使用异步从网站获取数据。作为示例,我使用了这段代码(在 A Better Coroutine Example 下):https://www.blog.pythonlibrary.org/2016/07/26/python-3-an-intro-to-asyncio/
现在这工作正常,但它将二进制块写入文件,我不希望它在文件中。我想要直接生成的数据。但是我目前有一个协程对象列表,我无法从中获取数据。
代码:
# -*- coding: utf-8 -*-
import aiohttp
import asyncio
import async_timeout
async def fetch(session, url):
with async_timeout.timeout(10):
async with session.get(url) as response:
return await response.text()
async def main(loop, urls):
async with aiohttp.ClientSession(loop=loop) as session:
tasks = [fetch(session, url) for url in urls]
await asyncio.gather(*tasks)
return tasks
# time normal way of retrieval
if __name__ == '__main__':
urls = [a list of urls..]
loop = asyncio.get_event_loop()
details_async = loop.run_until_complete(main(loop, urls))
谢谢
问题出在main()
末尾的return tasks
,原文中没有。而不是 returning 协程对象(一旦传递给 asyncio.gather
就没有用了),你应该 returning 由 asyncio.gather
编辑的元组 return,其中包含 运行 正确顺序的协同程序的结果。例如:
async def main(loop, urls):
async with aiohttp.ClientSession(loop=loop) as session:
tasks = [fetch(session, url) for url in urls]
results = await asyncio.gather(*tasks)
return results
现在 loop.run_until_complete(main(loop, urls))
将 return 一个与 URL 顺序相同的文本元组。