@ekam230

Как получить переменную data после исполнения асинхронной функции?

Как получить переменную data и использовать её в дальнейшем в программе после исполнения асинхронной функции?

import asyncio
import aiohttp

urls = ['http://www.google.com', 'http://www.yandex.ru', 'http://www.python.org']

async def call_url(url):
    print('Starting {}'.format(url))
    response = await aiohttp.ClientSession().get(url)
    data = await response.text()
    print('{}: {} bytes: {}'.format(url, len(data), data))
    return data # ВОТ ПЕРЕМЕННАЯ

futures = [call_url(url) for url in urls]


ioloop = asyncio.get_event_loop()

ioloop.run_until_complete(asyncio.wait(futures))

print(data) # Тут хочу распечатать data
  • Вопрос задан
  • 1198 просмотров
Решения вопроса 1
igorzakhar
@igorzakhar
Сессии нужно закрывать.
+
Don’t create a session per request. Most likely you need a session per application which performs all requests altogether.


Набросал на коленке:
import asyncio
import aiohttp


async def call_url(url, session):
    print('Starting {}'.format(url))
    async with session.get(url) as response:
        response = await session.get(url)
        data = await response.text()
        print('{}: {} bytes: {}'.format(url, len(data), data))
        return data


async def run(urls):
    async with aiohttp.ClientSession() as session:
        futures = [call_url(url, session) for url in urls]
        result = await asyncio.gather(*futures)
        return result

if __name__ == '__main__':
    urls = ['http://www.google.com',
            'http://www.yandex.ru', 'http://www.python.org']
    ioloop = asyncio.get_event_loop()
    data = ioloop.run_until_complete(run(urls))
    print(data)
    ioloop.close()
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
results = await asyncio.gather(*futures)
Ответ написан
Комментировать
sanya84
@sanya84
Фанатик Python 3
В функции call_url объявить переменную дата глобальной
async def call_url(url):
    global data
    # print('Starting {}'.format(url))
    response = await aiohttp.ClientSession().get(url)
    data = await response.text()
    # print('{}: {} bytes: {}'.format(url, len(data), data))
    return data # ВОТ ПЕРЕМЕННАЯ
Ответ написан
@bbkmzzzz
При асинхронном подходе логика программы другая. Вот тут неплохо почитать.
И не используйте глобальные переменные.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы