asyncio return Задача была уничтожена, но она находится на рассмотрении!

Я новичок в асинхронном программировании. Я пытаюсь написать скрипт, который используется для проверки состояния веб-страниц. И, конечно же, я бы хотел сделать это асинхронно. Мой фрагмент:

import aiohttp
import asyncio

url_site = 'http://anysite.com'
fuzz_file = 'fuzz.txt'


def generate_links(file):
    with open(file) as f:
        return [str(url_site) + str(line.strip()) for line in f]

async def fetch_page(client, url):
    async with client.get(url) as response:
        return response.status

async def run():
    links = generate_links(fuzz_file)
    for f,link in asyncio.as_completed([fetch_page(client,link) for link in links]):
        print("[INFO] [{}] {}".format(f, link))


loop = asyncio.get_event_loop()
conn = aiohttp.ProxyConnector(proxy="http://10.7.0.35:8080")
client = aiohttp.ClientSession(loop=loop, connector=conn)
loop.run_until_complete(run())
client.close()

Но я получаю следующие ошибки: Task was destroyed but it is pending! Может ли кто-нибудь указать мне, где я допустил ошибку?


person Community    schedule 26.11.2015    source источник


Ответы (1)


Из документации для as_completed:

Возвращает итератор, значения которого при ожидании являются экземплярами Future.

Таким образом, вы должны await каждый объект, возвращаемый as_completed:

for f in asyncio.as_completed([fetch_page(client,link) for link in links]):
    status = await f

Вы также можете заглянуть в wait, чтобы узнать больше. гранулированный контроль.

person Jashandeep Sohi    schedule 26.11.2015
comment
Я не получаю эти ошибки. Какую версию используете? - person Jashandeep Sohi; 27.11.2015
comment
Я использую python 3.5, asyncio 3.4.3, aiohttp 0.19. - person ; 30.11.2015
comment
Я тоже, но я не получаю никаких ошибок; однако я не использую ProxyConnector, так что, может быть, это вызывает проблему? Кроме того, явно закройте цикл обработки событий: loop.close() - person Jashandeep Sohi; 01.12.2015