2016-11-11 9 views
2

に遅くなり、私は次の行でそれを実行すると、私は非同期的にいくつかのURLをダウンロードするスクリプトを持って、その後、連続difflibPythonのAsyncioがクロール

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)) 

を経由して、変更のためにそれらを監視

 for line in diff: 
      print(line) 
コメント

スクリプトは期待どおりに実行され、各URLは毎秒約3回取り出されます。

行のコメントを外すと、スクリプトの実行速度が低下し、検索が連続して実行された場合よりもはるかに遅くなります。

なぜこのようなことが起こっているのかわかりませんが、difflibがジェネレータを返すことと関係がありますか?

答えて

0

まず、コードにエラーがあります。new = await resp.text()ではなく、new = await resp1.text()である必要があります。

unified_diffは文字列のリストで動作し、文字列では直接動作しません。あなたはすぐに行に文字列を分割するsplitlines()を使用することができます(!現在、長い文字列の各文字は行として扱われます)

diff = difflib.unified_diff(old.splitlines(), new.splitlines()) 

関連する問題