2016-06-12 66 views
6

İki scripti, scraper.py ve db_control.py var. Verilerin yeterli elde edilene kadarAiohttp, Asyncio: RuntimeError: Olay döngüsü kapalı

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

Teorik olarak, kavgacı başlatılmalıdır bilinmeyen-sürelerini:

... 
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 ] 

... 

Ve db_control.py içinde: scraper.py ben böyle bir şey var.

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 

Ama sadece bir kere) hurda (çalıştırırsanız komut sadece iyi çalışır: Ama new imidiatelly > 15 olmadığında o zaman bu hata oluşur. Yani loop = asyncio.get_event_loop() yeniden oluşturma ile ilgili bir sorun var sanırım, this denedim ama hiçbir şey değişmedi. Bunu nasıl düzeltebilirim? Tabii ki bunlar kodumun snippet'leri, problemin başka bir yerde olabileceğini düşünüyorsanız, tüm kod here kullanılabilir.

cevap

7

Yöntemleri run_until_complete, run_forever, run_in_executor, create_task, call_at açıkça döngü kontrol edip Kapalı olduğu takdirde istisna. dokümanlardan

Alıntı - BaseEvenLoop.close: Her olmasını istiyorsanız

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 ] 

: Bazı (iyi) nedenleri yoksa

This is idempotent and irreversible


, sadece yakın çizgiyi ihmal olabilir zaman yepyeni bir döngü, bunu elle oluştur ve varsayılan olarak ayarla:

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

Teşekkürler! Şimdi bir çekicilik gibi çalışıyor :) –