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
PRO

October 20, 2017
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

  1. Асинхронный Python
    Реальные впечатления
    Moscow Python Conference 2017
    Владимир Филонов

    View Slide

  2. Владимир Филонов
    ● Питонист

    View Slide

  3. Владимир Филонов
    ● Питонист
    ○ Уж скоро 10 лет

    View Slide

  4. Владимир Филонов
    ● Питонист
    ○ Уж скоро 10 лет
    ● Евангелист

    View Slide

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

    View Slide

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

    View Slide

  7. Владимир Филонов
    ● Питонист
    ○ Уж скоро 10 лет
    ● Евангелист
    ○ Moscow Python, Django Girls, Learn.Python
    ● Авантюрист
    ○ Люблю применять новые технологии и подходы

    View Slide

  8. Что использую

    View Slide

  9. Что использую
    ● aiohttp

    View Slide

  10. Что использую
    ● aiohttp
    ● aiohttp.web

    View Slide

  11. Что использую
    ● aiohttp
    ● aiohttp.web
    ● aiopg

    View Slide

  12. Что использую
    ● aiohttp
    ● aiohttp.web
    ● aiopg
    ● aioredis

    View Slide

  13. Что использую
    ● aiohttp
    ● aiohttp.web
    ● aiopg
    ● aioredis
    ● aioes

    View Slide

  14. Для чего использую

    View Slide

  15. Для чего использую
    ● Простой веб

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  24. Что изменилось, по сравнению с
    синхронным питоном?

    View Slide

  25. Сознание

    View Slide

  26. Сознание
    ● Поначалу асихронность действительно непривычна
    ● Но после Erlang очень просто =)
    ● Event loop — программа разбивается

    View Slide

  27. Разработка

    View Slide

  28. Консоль python

    View Slide

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

    View Slide

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

    View Slide

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

    >>> await something()
    File "", line 1
    await something()
    ^
    SyntaxError: invalid syntax

    View Slide

  32. >>> import asyncio
    >>> loop = asyncio.get_event_loop()
    >>> loop.run_until_complete(test())
    Here i am

    View Slide

  33. aioconsole

    View Slide

  34. >>> async def test():
    ... return "Here i am"
    >>> await test()
    Here i am

    View Slide

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

    View Slide

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

    View Slide

  37. Нет автокомлита, истории и поиска

    View Slide

  38. # apython.py
    import asyncio
    loop = asyncio.get_event_loop()
    def _await(coro):
    return loop.run_until_complete(coro)

    View Slide

  39. # 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'

    View Slide

  40. >>> async def test():
    ... return "Here i am"
    >>> _await(test())
    Here i am

    View Slide

  41. Дебаггер в PyCharm

    View Slide

  42. View Slide

  43. Тестирование

    View Slide

  44. pytest-asyncio

    View Slide

  45. @pytest.mark.asyncio
    async def test_async_test():
    result = await library.test()
    assert result == 'Here i am'

    View Slide

  46. pytest-asyncio
    ● Асинхронные фикстуры
    ● Быстрый проброс сводобных TCP портов
    ● Вся мощь py.test

    View Slide

  47. asynctest

    View Slide

  48. asynctest
    ● Обёртка вокруг unittest
    ● Батарейки типа асинхронных моков
    ● Моки для IO объектов (FileMock, SocketMock, SSLSocketMock)

    View Slide

  49. 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"

    View Slide

  50. Runtime

    View Slide

  51. Оно работает

    View Slide

  52. Тут слайд про сравнение
    производительности

    View Slide

  53. http://klen.github.io/py-frameworks-bench/

    View Slide

  54. Не смешивать синхронное и асинхронное

    View Slide

  55. async def poll_and_process():
    while True:
    data = await poll_data_from_somewhere()
    await process_data(data)
    sleep(10)

    View Slide

  56. async def poll_and_process():
    while True:
    data = await poll_data_from_somewhere()
    await process_data(data)
    sleep(10)

    View Slide

  57. async def poll_and_process():
    while True:
    data = await poll_data_from_somewhere()
    await process_data(data)
    await asyncio.sleep(10)

    View Slide

  58. import requests
    async def poll_data_from_somewhere()
    return requests.get("http://some-source.com/").json()

    View Slide

  59. А еще иногда память подтекает

    View Slide

  60. Исключения — строго внутри
    сопрограмм

    View Slide

  61. 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()

    View Slide

  62. Выводы

    View Slide

  63. ● async/await не себерянная пуля для производительности
    ● Но там где много ввода-вывода (web например) — очень хорошо
    ○ А вот если у вас функция долго-долго что-то обсчитывает — асинк не поможет
    ● Главное не напортачить с блокирующими операциями
    Выводы

    View Slide

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

    View Slide

  65. Асинхронность в python конкурентная,
    но не параллельная

    View Slide

  66. PS: А вот в PyPy — параллельная

    View Slide

  67. Спасибо! Вопросы?
    https://fb.com/pyhoster
    [email protected]

    View Slide