自从Python 3.5引入async with之后,docs中推荐的aiohttp语法已经改变.现在,要获得他们建议的单一url:

import aiohttp
import asyncio

async def fetch(session, url):
    with aiohttp.Timeout(10):
        async with session.get(url) as response:
            return await response.text()

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    with aiohttp.ClientSession(loop=loop) as session:
        html = loop.run_until_complete(
            fetch(session, 'http://python.org'))
        print(html)

我如何修改它来获取一个url集合,而不是一个url?

在旧的asyncio个示例中,您将设置一个任务列表,例如

    tasks = [
            fetch(session, 'http://cnn.com'),
            fetch(session, 'http://google.com'),
            fetch(session, 'http://twitter.com')
            ]

我试图将这样的列表与上述方法结合起来,但失败了.

推荐答案

对于并行执行,您需要asyncio.Task

我已将您的示例转换为从多个来源获取并发数据:

import aiohttp
import asyncio

async def fetch(session, url):
    async with session.get(url) as response:
        if response.status != 200:
            response.raise_for_status()
        return await response.text()

async def fetch_all(session, urls):
    tasks = []
    for url in urls:
        task = asyncio.create_task(fetch(session, url))
        tasks.append(task)
    results = await asyncio.gather(*tasks)
    return results

async def main():    
    urls = ['http://cnn.com',
            'http://google.com',
            'http://twitter.com']
    async with aiohttp.ClientSession() as session:
        htmls = await fetch_all(session, urls)
        print(htmls)

if __name__ == '__main__':
    asyncio.run(main())

Python-3.x相关问答推荐

Python gpsd客户端

我没有';无法理解此TemplateDoesNotExist错误

Python GUI:tkinter应用程序作为Windows的实时桌面

如何将从维基百科表中抓取的数据转换为字典列表?

如何使用Selenium从网站下拉菜单中获取值列表?

通过匹配第一列的行值,逐个单元格地添加两个Pandas 数据框中的浮点数

来自嵌套字典的完整地址

!date 的命令无法从 jupyter notebook 运行

包含值超出范围的 ID 的新 DataFrame 列?

如何在pyspark的列中按连续1分组并保持具有特定大小的组

Python defaultdict 在获取时返回 None,尽管使用默认值初始化

为什么我不能通过索引获取字典键?

活动屏幕上的 PyQt4 中心窗口

使用 python 正则表达式匹配日期

smtplib 在 Python 3.1 中发送带有 unicode 字符的邮件的问题

如何从左到右解包元组?

使用逗号时,除了处理程序中的语法无效

Pandas 的 EMA 与股票的 EMA 不匹配?

接收导入错误:没有名为 *** 的模块,但有 __init__.py

如何将二进制(字符串)转换为浮点值?