Skip to content
This repository has been archived by the owner on Aug 31, 2021. It is now read-only.

itonik/as2020

Repository files navigation

Asyncio

Запуcк c virtual environment:

python3 -m venv venv
. venv/bin/activate
pip install -r requirements.txt
./serve.sh

(На Windows активация venv: venv\Scripts\activate.bat)

Основы asyncio

Чтобы пользоваться asyncio достаточно понять несколько простых концептов:

  1. Корутина - функция с async в объявлении. В отличии от обычной фунции её необходимо запускать с помощью await либо create_task
async def coroutine(arg):
    print(f'Hello {arg}. Starting...')
    asyncio.sleep(2)
    print('done')
  1. await - дождаться выполнения корутины
await coroutine('programmer')
print('Awaited')

# > Hello programmer. Starting...
# (2sec pause)
# > done
# > Awaited
  1. asyncio.create_task(): не ждать выполнения корутины, запустить корутину "в фоне"
asyncio.create_task(coroutine('hacker'))
print('Not waiting')

# > Hello hacker. Starting...
# > Not waiting
# (2sec pause)
# > done
  1. Queue - очередь, новые элементы в которой можно ожидать (await)
new_element = await queue.get()

# Put в очереди тоже необходимо ждать (если очередь переполнена)
await queue.put(new_element)
  1. asyncio.run(): как await только в не асинхроном контексте. В server.py не нужна так как сам асинхронный контекст создаётся ASGI сервером (uvicorn)