Рубрики
Без рубрики

История асинхронного программирования

История того, почему мы используем асинхронное программирование.

Автор оригинала: Rob Britton.

При написании современных веб-или мобильных приложений, известно, что асинхронное программирование (ASYNC) предпочтительнее синхронного программирования (синхронизации) при создании высоких систем QPS, таких как веб-серверы. Но почему это дело? Я нашел при ответе на вопросы о узле или при помощи людям приходить с узла на другие языки, они всегда спрашивают, как пройти писать async код. Но если я спрошу их, почему им нужно async это, они не всегда могут мне сказать. Поэтому сегодня мы погрузимся в историю одновременного программирования, чтобы узнать, почему Async предпочтительнее, а в каких случаях это не полезно.

Давайте вернемся вовремя до 25 лет до примерно в 1993 году. Мы могли бы вернуться дальше, но, хотя история очень интересная, нам действительно не нужно знать эти детали, чтобы понять Async. В 1993 году нить были рядом, но они были не так часто, как вы могли подумать, потому что большинство программистов, как правило, нужно только для работы в однопоточном мире, и потоки обычно были только полезны, когда вы хотите загрузить некоторые вещи из медленного источника, как Жесткий диск или сеть, и обрабатывают некоторые из этих вещей, в то время как другие пришли. Они также были довольно полезны при строительстве Guis, поскольку у вас может быть одно нить, управляющее взаимодействием пользовательского интерфейса, в то время как другие потоки сделали полезные вещи. Единственные оптимизации, которые необходимо сделать для потоков базовой системы, было не забывать, чтобы избежать планирования потоков, которые ждали ввода/вывода, поэтому вам не нужно было тратить много времени на переключение времени.

Давайте перейдемся через несколько лет сейчас, в эпоху DOT-COM. Это когда интернет взлетал, и поэтому вы увидели высокопроизводительные веб-серверы, а серверы баз данных становятся очень полезными. Модель резьбы, которую эти серверы используют очень разные – вместо того, чтобы вращаться в нескольких потоках, которые являются относительно долгоживающимися, эти системы используют много потоков, которые чрезвычайно недолговечны. Резьба спинов, получает входящий запрос, пишет ответ, а затем умирает.

При работе с системой с низким содержанием QPS это не огромная проблема, поскольку накладные расходы спиннинга вверх и вниз поток не так значительно – особенно с базами данных, которые проводят свои данные о обработке времени. В новом мире Web World, хотя эти запросы были очень быстрыми, как правило, просто просматривают данные в индексе и написания ответа, поэтому накладные расходы спиннинга вверх и вниз потоков стали довольно высокими.

Когда где-то есть неэффективность или замедление, умные инженеры будут садиться и подумать о решении, чтобы сделать его быстрее. В этом случае некоторые из этих смарт-инженеров где-то решили, что вместо вращающихся ниток вверх и вниз, они просто начнут «пул» нитей, которые будут сидеть без простоя, а затем распределить любую доступную работу по мере необходимости среди потоков. Некоторые приложения не нуждались в слишком многих потоках, и поэтому будут иметь лишь несколько, но другие приложения, такие как высокие серверы QPS, могут понадобиться много нитей, и поэтому они могут раскрутить их нагрузки. Эта техника была неудивительно, что «объединение резьбы».

Это решение работало некоторое время, однако, так как всегда есть случай с каким-либо техническим выбором, появились некоторые недостатки. Как только система имела слишком много вещей, и исчерпала пул холостых потоков, новых вещей (например, входящие веб-соединения) пришлось дождаться, чтобы быть обработаны. В крайних случаях новые соединения могут просто разум, и клиент не мог вообще подключаться. Другим примером являются приложения GUI, где нить пользовательского интерфейса может потенциально заблокирована и строго снижает отзывчивость приложения.

Это проблема, что асинхронное программирование решает. Во многих приложениях, которые используют резьбовые пулы, нити на самом деле не делают много, но ждут что-то еще – база данных, другой веб-сервис или некоторые пользовательские ввода. Если вместо нивки просто ждет ответ, вы настроили некоторую систему, чтобы вызвать какой-нибудь код, когда он доступен, вы можете вернуть поток в пул резьбы, чтобы выполнить некоторую другую полезную работу. Таким образом, вы можете иметь больше операций, чем у вас нити. Недостатком является то, что есть вероятность того, что когда ответ вернется, нет доступных потоков, но если потоки быстро ездуют быстро, то новое должно быть довольно быстро.

Поэтому в следующий раз вы раздражены на необходимости иметь дело со сложной цепочкой обещаний (aka Futures), в комплекте с массивами и обработкой неудач, помните, что все этот беспорядок связан с нитями, взявшись за немного, чтобы начать вверх и вниз.