#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
модуль в PyPI2. Кроме того, с совместными подпрограммами вы должны ожидать включения
ayncio.sleep
вместо вызоваtime.sleep
3. Большое вам спасибо. Правильно, мне нужно использовать aiohttp. Как я могу заставить функцию run ждать другой сопрограммы?
4. ожидание завершения совместной процедуры, как в
awaitin&
на ней? Вы просто говоритеawait <coroutine&&t;
. Чтобы дождаться уже запущенной сопрограммы, используйте asyncio.wait_for5. Хорошо! Но я уже использую await в цикле foor, перед каждым выполнением run. Или я использую ее не в том месте?