Sto provando a fare un sacco di richieste (~ 1000) usando Asyncio e la libreria aiohttp, ma sto incontrando un problema su cui non riesco a trovare molte informazioni.Asyncio RuntimeError: Event Loop è chiuso
Quando eseguo questo codice con 10 URL, funziona perfettamente. Quando lo eseguo con 100+ urls, si rompe e mi dà l'errore RuntimeError: Event loop is closed
.
import asyncio
import aiohttp
@asyncio.coroutine
def get_status(url):
code = '000'
try:
res = yield from asyncio.wait_for(aiohttp.request('GET', url), 4)
code = res.status
res.close()
except Exception as e:
print(e)
print(code)
if __name__ == "__main__":
urls = ['https://google.com/'] * 100
coros = [asyncio.Task(get_status(url)) for url in urls]
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(coros))
loop.close()
L'analisi dello stack può essere trovato here.
Qualsiasi aiuto o intuizione sarebbe molto apprezzato visto che ho battuto la testa per ore. Ovviamente questo suggerirebbe che un ciclo di eventi è stato chiuso che dovrebbe essere ancora aperto, ma non vedo come sia possibile.
non è 'errore Asyncio'. Errore ricorsivo Python, limite raggiunto. necessario thread per tutte le funzioni non class ... – dsgdfg
Prima di tutto, assicurati di utilizzare l'ultima versione di aiohttp. Suppongo che tu lo faccia. Tecnicamente aiohttp ha bisogno di un ciclo iterativo dopo aver terminato la richiesta di chiusura dei socket sottostanti. Quindi inserire 'loop.run_until_complete (asyncio.sleep (0))' prima della chiamata 'loop.close()'. –
Il traceback suggerisce che un lavoro inviato a un [Executor] (https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.Executor) tramite [run_in_executor] (https: // docs .python.org/3/library/asyncio-eventloop.html # asyncio.BaseEventLoop.run_in_executor) restituiti dopo che il ciclo è stato chiuso. Stranamente, [aiohttp] (https://github.com/KeepSafe/aiohttp/search?utf8=%E2%9C%93&q=run_in_executor&type=Code) e [asyncio] (https://github.com/python/asyncio/search? utf8 =% E2% 9C% 93 & q = run_in_executor) non usare 'run_in_executor' ... – Vincent