Виктор Сергиенко «Асинхронный io-boundpython: миф или...

21

Upload: dataart

Post on 21-Mar-2017

999 views

Category:

Technology


1 download

TRANSCRIPT

Спикер:

Тема:

Виктор Сергиенко [email protected]

Асинхронный IO-bound Python: миф или реальность?

Перепеваю по телефону исследование Майка Бейера

(на самом деле, речь в основном о полезности async i/o на базах данных)

http://techspot.zzzeek.org/2015/02/15/asynchronous-python-and-databases/

Javascript был готов к async I/O

• нет многопоточности

• работа (GUI) построена на событиях

• армия опытнейших программистов.

И вот мы на сервере!

Русские шпионы украли из Пентагона последние 100 строк

каждого файла из прошивки американских ядерных ракет!

Никаких спагетти в Python!

• Генераторы Python позволяют писать асинхронный код почти так же, как синхронный.

• Теперь с asyncio!

SQLAlchemy? asyncio? Шо, да?

• Async - это не волшебная пыльца фей для производительности.

• ОК, мы не будем сравнивать тёплое с мягким. Посмотрим только с т.з. СУБД.

Python НАМНОГО медленнее вашей СУБД

Локально: 1с/9с

По сети: 8с/24с

* I/O - розовое

А что нам надо?

@asyncio.coroutinedef some_coroutine(): conn = yield from db.connect() return conn

”Твоя БД всё равно тормозит больше!”

yield from: 12.52snormal: 2.11s

Бенчмарк, или “а ты попробуй!”

psycopg aiopg

MAC BOOK PRO w/ OSX/ 32GLOCAL POSTGRESQL 9.4

LENOVO THINKPAD, 32G w/ FEDORA 21LOCAL POSTGRESQL 9.3.5

LENOVO THINKPAD, 32G w/ FEDORA 21LOCAL POSTGRESQL 9.3.5

LENOVO THINKPAD w/ FEDORA 21NETWORK TO MAC BOOK PRO W/ POSTGRESQL 9.4

Ладно, но с async код проще.

Найдите 10 отличий

“Iтогi пiдведьом”

• asyncio УХУДШАЕТ связь с БД.• Для локальной БД -

катастрофически.• Проверяйте то, что вам

говорят!• Не лучше ли nginx + uWsgi?

Ответ: Jesse Jiryu Davis, автор Motor

@asyncio.coroutinedef my_query_method(): # "yield from" unblocks the event loop while # waiting for the database. result = yield from my_db.query(“query")

“Всё так. Но в асинхронных приложениях нужно разгружать event loop.Реализация драйвера может быть синхронной, нужно только асинхронное API”.

Ответ: Brett Slatkin: GAE, Google App Surveys, “Effective Python”

• What if you want to mix:• queries through SQLAlchemy • with lookups in Memcache and Redis, • and simultaneously enqueue some

background tasks with Celery?• Amdahl's law: “параллелизм может только

приблизиться ко времени выполнения самого длинного непараллельного фрагмента”

• см. ответ Джесси Дэвис.