首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用difflib的Python Asyncio变慢为爬行

使用difflib的Python Asyncio变慢为爬行
EN

Stack Overflow用户
提问于 2016-11-11 16:21:38
回答 1查看 111关注 0票数 2

我有一个异步下载多个urls的脚本,然后通过difflib持续监视它们的更改

代码语言:javascript
复制
import asyncio
import difflib
import aiohttp

urls = ['http://www.nytimes.com/',
        'http://www.time.com/',
        'http://www.economist.com/']

async def get_url(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as resp:
            old = await resp.text()
            print('Initial -',url)
        while True:
            async with session.get(url) as resp1:
                new = await resp.text()
            print('Got -',url)
            diff = difflib.unified_diff(old, new)

            for line in diff:
                print(line)
            old = new

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    ops = []
    for url in urls:
        ops.append(get_url(url))
    loop.run_until_complete(asyncio.wait(ops))

当我使用以下几行注释运行它时

代码语言:javascript
复制
        for line in diff:
            print(line)

该脚本按预期运行,每秒检索每个url约3次。

当这些行没有注释时,脚本会变慢,这比串行运行检索要慢得多。

我不知道为什么会发生这种情况,是不是和difflib返回一个生成器有关?

EN

回答 1

Stack Overflow用户

发布于 2017-01-10 17:41:09

首先,你的代码中有一个错误,它应该是new = await resp1.text(),而不是new = await resp.text()

unified_diff使用字符串列表,而不是直接使用字符串。您可以使用splitlines()将字符串快速拆分成行:

代码语言:javascript
复制
diff = difflib.unified_diff(old.splitlines(), new.splitlines())

(目前,长字符串中的每个字符都被视为一行!)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40543860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档