2016-06-12 2 views
6

私はscraper.pyとdb_control.pyの2つのスクリプトを持っています。データの十分が得られるまでAiohttp、Asyncio:RuntimeError:イベントループが閉じられる

from scraper import scrap 
... 
while new < 15: 
    data = scrap(category, field, pages, search, use_proxy, proxy_file) 
    ... 
... 

理論的には、スクラッパーが開始されなければならない未知の-回:

... 
def scrap(category, field, pages, search, use_proxy, proxy_file): 
    ... 
    loop = asyncio.get_event_loop() 

    to_do = [ get_pages(url, params, conngen) for url in urls ] 
    wait_coro = asyncio.wait(to_do) 
    res, _ = loop.run_until_complete(wait_coro) 
    ... 
    loop.close() 

    return [ x.result() for x in res ] 

... 

そしてdb_control.py中:scraper.pyでは、私はこのようなものを持っています。

File "/usr/lib/python3.4/asyncio/base_events.py", line 293, in run_until_complete 
self._check_closed() 
    File "/usr/lib/python3.4/asyncio/base_events.py", line 265, in _check_closed 
raise RuntimeError('Event loop is closed') 
RuntimeError: Event loop is closed 

をしかし、私は一度だけ)スクラップを(実行する場合、スクリプトは正常に動作します:しかしnewはimidiatelly > 15ないときにこのエラーが発生します。だから私はloop = asyncio.get_event_loop()を再現することにいくつかの問題があると思いますが、私はthisを試しましたが、何も変わりませんでした。どうすればこの問題を解決できますか?もちろん、それらは私のコードのスニペットです。問題が他の場所にあると思われる場合は、フルコードが利用可能ですhere

答えて

7

方法run_until_completerun_foreverrun_in_executorcreate_taskcall_atは、明示的に ループをチェックし、それが閉じていた場合に例外をスローします。ドキュメントから

引用 - BaseEvenLoop.close:あなたは、各を持っているしたい場合は

def scrap(category, field, pages, search, use_proxy, proxy_file): 
    #... 
    loop = asyncio.get_event_loop() 

    to_do = [ get_pages(url, params, conngen) for url in urls ] 
    wait_coro = asyncio.wait(to_do) 
    res, _ = loop.run_until_complete(wait_coro) 
    #... 
    # loop.close() 
    return [ x.result() for x in res ] 

This is idempotent and irreversible


あなたには、いくつかの(良い)な理由がない限り、あなたは単に近いラインを省略するかもしれませんまったく新しいループを実行するには、手動で作成してデフォルトとして設定する必要があります。

def scrap(category, field, pages, search, use_proxy, proxy_file): 
    #... 
    loop = asyncio.new_event_loop() 
    asyncio.set_event_loop(loop)  
    to_do = [ get_pages(url, params, conngen) for url in urls ] 
    wait_coro = asyncio.wait(to_do) 
    res, _ = loop.run_until_complete(wait_coro) 
    #... 
    return [ x.result() for x in res ] 
+0

ありがとうございました!作品は今の魅力のように:) –

関連する問題