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

asyncio в Python. Как устроено и зачем нужно?

asyncio в Python. Как устроено и зачем нужно?

В python 3.4 появился asyncio. До сих пор многие разработчики не знают, что это такое, как реализуется асинхронность в Python и в чем её сильные и слабые места. Повторим пройденное и заглянем под капот.

Павел Петлинский
Moscow Python Meetup №30

Moscow Python Meetup

November 19, 2015
Tweet

More Decks by Moscow Python Meetup

Other Decks in Technology

Transcript

  1. Много-много лет назад • Клиентов было мало • Интернет был

    медленный • Можно обрабатывать каждый запрос в отдельном процессе • Можно обрабатывать каждый запрос в отдельном треде Проблема Что делать, если клиентов 10 тысяч? 2
  2. Twisted Первая кровь “It's time for web servers to handle

    ten thousand clients simultaneously, don't you think? After all, the web is a big place now.” © Dan Kegel 1999 год http://www.kegel.com/c10k.html “The built-in scripts are probably only appropriate for a small-to-medium website, and the server can comfortably handle 50 dynamic-content requests per second on middle-of-the-road hardware; however, since Twisted is entirely in Python, it's quite easy to script the webserver to do whatever you like!” © Twisted v0.9.0 2001 год https://twistedmatrix.com/trac/browser/tags/release-0_9_0/README?rev=10242 3
  3. Проблемы • asyncio.Future != concurrent.futures.Future • asyncio.Condition != threading.Condition •

    Нельзя просто взять и сделать код асинхронным • Нельзя просто взять и запустить многопоточный код как асинхронный 12
  4. Где подходит? • Много IO, который хотим обрабатывать “параллельно” •

    Отложенные действия • Событийные системы 13 Где не подходит? • IO мало, а вычислений много или много данных • Если события должны всегда происходить строго последовательно
  5. Хорошие новости! 14 Юрий Селиванов (автор PEP-492 об async/await) взял

    libuv и построил с её помощью uvloop -- asyncio совместимый event loop. В результате: 600000 in 12.447252035140991 48203.41054443859 requests/sec Что в 3.5 раза быстрее стандартного asyncio event loop. © https://github.com/python/asyncio/issues/282#issuecomment-155957235