Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Асинхронность в Python: оглядываясь назад

Асинхронность в Python: оглядываясь назад

Владимир Филонов (itcanfly, Founder/CTO) @ Moscow Python Conf 2017
"Уже примерно год, как я использую асинхронный python в боевых проектах. Мнолитные системы, микросервисы, утилиты. Думаю пора рассказать какие выводы я сделал за этот год, чего хотел бы увидеть в python в будущем, и почему продолжаю применять Erlang\Elixir".
Видео: https://conf.python.ru/asinhronnost-v-python-oglyadyvayas-nazad/

Moscow Python Meetup

October 20, 2017
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

  1. Владимир Филонов • Питонист ◦ Уж скоро 10 лет •

    Евангелист ◦ Moscow Python, Django Girls, Learn.Python
  2. Владимир Филонов • Питонист ◦ Уж скоро 10 лет •

    Евангелист ◦ Moscow Python, Django Girls, Learn.Python • Авантюрист
  3. Владимир Филонов • Питонист ◦ Уж скоро 10 лет •

    Евангелист ◦ Moscow Python, Django Girls, Learn.Python • Авантюрист ◦ Люблю применять новые технологии и подходы
  4. Для чего использую • Простой веб ◦ Оффтоп: В jinja

    2.9+ появились асинхронные методы
  5. Для чего использую • Простой веб ◦ Оффтоп: В jinja

    2.9+ появились асинхронные методы • REST API
  6. Для чего использую • Простой веб ◦ Оффтоп: В jinja

    2.9+ появились асинхронные методы • REST API • Микросервисы
  7. Для чего использую • Простой веб ◦ Оффтоп: В jinja

    2.9+ появились асинхронные методы • REST API • Микросервисы • Воркеры
  8. Для чего использую • Простой веб ◦ Оффтоп: В jinja

    2.9+ появились асинхронные методы • REST API • Микросервисы • Воркеры ◦ Ну не люблю я celery, что поделать
  9. Для чего использую • Простой веб ◦ Оффтоп: В jinja

    2.9+ появились асинхронные методы • REST API • Микросервисы • Воркеры ◦ Ну не люблю я celery, что поделать • Асинхронные прокси для Django
  10. Для чего использую • Простой веб ◦ Оффтоп: В jinja

    2.9+ появились асинхронные методы • REST API • Микросервисы • Воркеры ◦ Ну не люблю я celery, что поделать • Асинхронные прокси для Django ◦ В основном для websocket
  11. Для чего использую • Простой веб ◦ Оффтоп: В jinja

    2.9+ появились асинхронные методы • REST API • Микросервисы • Воркеры ◦ Ну не люблю я celery, что поделать • Асинхронные прокси для Django ◦ В основном для websocket ◦ Каюсь, до channels и asgi так и не добрался
  12. >>> async def test(): ... return "Here i am!" >>>

    from somewhere import something
  13. >>> async def test(): ... return "Here i am!" >>>

    from somewhere import something >>> test() <coroutine object test at 0x7fd8a0745eb8>
  14. >>> async def test(): ... return "Here i am!" >>>

    from somewhere import something >>> test() <coroutine object test at 0x7fd8a0745eb8> >>> await something() File "<stdin>", line 1 await something() ^ SyntaxError: invalid syntax
  15. >>> async def test(): ... return "Here i am" >>>

    await test() Here i am >>> ^[[A
  16. >>> async def test(): ... return "Here i am" >>>

    await test() Here i am >>> ^[[A >>> awit^[[D^[[D
  17. # apython.py import asyncio loop = asyncio.get_event_loop() def _await(coro): return

    loop.run_until_complete(coro) # ~/.bashrc alias apython='/usr/bin/env python3 -i /path/to/apython.py'
  18. asynctest • Обёртка вокруг unittest • Батарейки типа асинхронных моков

    • Моки для IO объектов (FileMock, SocketMock, SSLSocketMock)
  19. mock = asynctest.SocketMock() mock.recv.return_value = b"Data" def read_ready(sock): print("received:", sock.recv(1024))

    loop.add_reader(mock, read_ready, mock) set_read_ready() loop.run_forever() # prints received: b"Data"
  20. async def universe_factory(): try: await big_bang() except Exception: logger.error("New Universe

    failed =(") async def big_bang(): return float("inf")/0 loop = asyncio.get_event_loop() loop.create_task(universe_factory()) loop.run_forever() loop.close()
  21. • async/await не себерянная пуля для производительности • Но там

    где много ввода-вывода (web например) — очень хорошо ◦ А вот если у вас функция долго-долго что-то обсчитывает — асинк не поможет • Главное не напортачить с блокирующими операциями Выводы
  22. • Асинхронность всё-таки еще очень сырая • И сильно проигрывает

    в реализации против модели с вытесняющей многозадачностью и асинхронным вводом-выводом, как в Erlang\Elixir Еще выводы