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

Что внутри у питона: откуда быть пошел async

Что внутри у питона: откуда быть пошел async

Злата Обуховская (Teamlead в Nvidia) @ MoscowPython Meetup 61

"В этой части мы сконцентрируем внимание на процессе интерпретации. Подробно разберем внутренние структуры интерпретатора. Рассмотрим, как в язык добавили слово async, и какие изменения в виртуальной машине пришлось сделать для этого".

Видео: http://www.moscowpython.ru/meetup/61/inside-python2/

Moscow Python Meetup
PRO

November 29, 2018
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

  1. Что внутри у питона:
    откуда быть пошел async
    Злата Обуховская

    View Slide

  2. Какие скрипты мы обычно пишем?

    View Slide

  3. Скрипты, которые собирают данные

    View Slide

  4. Какой была concurrency в 2
    треды
    гринтреды (например, gevent)
    callbacks (например, Tornado)

    View Slide

  5. Проблемы с тредами (помимо GIL)
    Racing, deadlocks, starvation
    Нельзя контролировать планировщик ОС
    Переключение контекста дорогая операция

    View Slide

  6. Gevent

    View Slide

  7. Gevent
    выглядит, как треды
    под капотом — ивент-луп
    переключение гринтредов подменяет системный стэк

    View Slide

  8. Проблемы с gevent
    легко блокирует остальные гринтреды, т.к. не умеет явно передавать
    контроль
    манкипатчинг делать в правильные моменты

    View Slide

  9. Callbacks

    View Slide

  10. Callbacks
    ивент-луп
    обработчики событий

    View Slide

  11. Callbacks

    View Slide

  12. Проблемы callbacks
    не могут быть очень долгими
    нужно таскать стейт коллбэка
    callback hell
    непонятно, как обрабатывать исключения

    View Slide

  13. Как эти проблемы решили в 3?

    View Slide

  14. Добавили асинхронность на уровне языка

    View Slide

  15. Генераторы спешат на помощь

    View Slide

  16. Как работает питон: короткая версия

    View Slide

  17. После кодогенерации получается CodeObject
    ● байткод (инструкции)
    ● таблицы символов
    ● области видимости

    View Slide

  18. View Slide

  19. Как выполняется байткод генератора?

    View Slide

  20. Код выполняется внутри фрейма

    View Slide

  21. View Slide

  22. View Slide

  23. View Slide

  24. View Slide

  25. View Slide

  26. Генератор умеет принимать значение

    View Slide

  27. Генератор мог бы помочь с асинхронностью
    умеет хранить контекст
    умеет явным образом возвращать выполнение
    умеет обрабатывать исключения
    можно писать чистенький код

    View Slide

  28. Генератор мог бы...
    невозможно строить пайплайны из генераторов
    нужен event loop

    View Slide

  29. Появился yield from (3.3)

    View Slide

  30. View Slide

  31. View Slide

  32. Питон 3.3 и виртуальная машина
    Изменения в грамматике, парсере, кодогенераторе
    Поменяли ceval.c (YIELD_FROM)
    Поменяли PyGenObject (gen_iternext и gen_throw)

    View Slide

  33. Уже почти асинхронность на уровне языка

    View Slide

  34. Появился asyncio (3.4)

    View Slide

  35. Появились корутины
    Интерфейс взяли у генераторов (декоратор asyncio.coroutine)

    View Slide

  36. Появились корутины и ивент луп
    Ивент луп можно написать свой

    View Slide

  37. View Slide

  38. View Slide

  39. async и await (3.5)

    View Slide

  40. View Slide

  41. asynс и await
    Появились Awaitable объекты
    Корутины на генераторах умеют yield
    Корутины на async def умеют await
    Есть проверка, чтобы обычные генераторы не использовались, как
    асинхронные

    View Slide

  42. View Slide

  43. View Slide

  44. Что было после 3.5
    Асинхронные генераторы
    asyncio.run
    Контекстные переменные
    Обработка исключений

    View Slide

  45. сингулярность
    асинхронность уже тут

    View Slide