Запуск асинхронной функции с помощью Python и Asyncio

#python #python-3.x #asynchronous #async-await #python-asyncio

#python #python-3.x #асинхронный #асинхронное ожидание #python-asyncio

Вопрос:

Я только начал работать с AsyncIO на Python, я создал очень простой тестовый скрипт, чтобы попытаться понять, как это работает.

Вот что я попробовал:

 import cfscrape, asyncio, json, time

BU = cfscrape.create_scraper()

async def run(market):
    
    try:
        # DATA RETRIEVAL #
        URL = "https://api.binance.com/api/v1/klines?amp;symbol={0}amp;interval=4hamp;limit=130".format(market)

        ResultRaw = BU.&et(URL, timeout=(10, 15)).content
        Result = json.loads(ResultRaw)

        print(Result)

        time.sleep(2)

        print('Finished')
        
    except Exception as e:
        print(e)


async def main():
    Tickers = ['BTCUSDT', 'ETHBTC', 'ETHUSDT']

    for market in Tickers:
        await run(market)

asyncio.run(main())
  

Этот скрипт принимает три параметра и выполняет простой запрос к конечной точке API, затем переходит в режим ожидания и печатает Finished . Результат будет выглядеть следующим образом:

 Result
Finished
Result 
Finished
Result 
Finished
  

Чего я не понимаю, так это следующего: почему не выводится:

 Result
Result
Result
Finished
Finished
Finished
  

Похоже, что скрипт выполняет функции синхронно, одну за другой. Вместо этого я хотел создать сопрограмму для каждого выполнения, поэтому три запроса должны были выполняться одновременно (почти). Опять же, я новичок в async Python, поэтому то, что я говорю, вероятно, неверно, но кто-нибудь может помочь мне разобраться в этом?

Комментарии:

1. Ваша функция run никогда не ожидает другую сопрограмму, следовательно, она никогда не «приостанавливается» и продолжает выполняться до тех пор, пока не вернется. Чтобы выполнять асинхронные HTTP-запросы, посмотрите на aiohttp модуль в PyPI

2. Кроме того, с совместными подпрограммами вы должны ожидать включения ayncio.sleep вместо вызова time.sleep

3. Большое вам спасибо. Правильно, мне нужно использовать aiohttp. Как я могу заставить функцию run ждать другой сопрограммы?

4. ожидание завершения совместной процедуры, как в awaitin& на ней? Вы просто говорите await <coroutine&&t; . Чтобы дождаться уже запущенной сопрограммы, используйте asyncio.wait_for

5. Хорошо! Но я уже использую await в цикле foor, перед каждым выполнением run. Или я использую ее не в том месте?