Step 7 (S-44757)

From Stepik Wiki
Jump to: navigation, search

Step on Stepik: https://stepik.org/lesson/14825/step/7

Step 7 (S-44757) 1.png

[00:00 - 00:18] какие есть альтернативы решения смотри поточном и многопроцессорном многопроцессность серверов альтернативу являются неблокирующими вот вывод как выглядит неблокирующий вот вывод а на диаграмме


[00:18 - 00:36] выглядит он следующим образом а в общем и целом схема такая же то есть приходят некоторые запрос к серверу а серверов понимается запрос и делает вызов например чтение из сокета


[00:36 - 00:55] прочитать данные а ядро операционной системы выполняют свою работу и понимает что данных нет а процесс надо бы усыплять но а конкретно данной сокеты был создан со специальной опции неблокирующего ввода вывода


[00:55 - 01:09] поэтому ядро операционной системы вместо того чтобы усыпить процесс оно возвращает управление то есть происходит возврат из функции рф вот вот этот возврат имеется ввиду


[01:09 - 01:25] а специальным кодом е агент либо я вот блог а этот код говорит буквально следующее а вы вызвали сделали вызов функции системного вызова но этот вызов он сейчас


[01:25 - 01:43] по идеи должен был бы вас заблокировать а дальше делайте что хотите в этот момент когда а произошел вызов из системного вызова приложения может заняться обработкой других клиентов то есть


[01:43 - 01:58] операцию чтения оно инициировала а сразу же получила возврат в правление в этот момент приложение может заняться обработкой других клиент то есть вот пожалуйста принять но высокий и начать с ним ту же самую историю


[01:58 - 02:15] попытаться прочитать его данные а со 2 та же история то есть операционная система также вернет я вот блок то есть данная операция сейчас вас заблокировал приложение


[02:15 - 02:32] продолжить работу с 3 клиентов а либо возможно решить что следует заново проверить 1 вот это тонкий момент какой то а в какой то момент времени приложение оно решает повторно сделать вызов для 1 сетевого соединения от


[02:32 - 02:50] для того кто здесь был получен вот здесь мы делаем вызов опять таки для этого сетевого соединения а к этому моменту времени данные уже пришли из сети вот они данные есть в сокете поэтому операционная система


[02:50 - 03:07] сразу их вернет здесь уже возвращаться не код ошибки готовые данные с ними можно работать а в чем + такого подхода мы видим что в этот момент времени а


[03:07 - 03:25] что при неблокирующим вводе выводе приложение не засыпает то есть оно не не блокируется а оно может продолжает в здесь обрабатывают других клиентов таким образом мы достигаем параллельной работы с разными клиентами


[03:25 - 03:40] давайте попробуем посмотреть как это выглядит а на практике такой прием когда у нас есть 1 поток 1 процесс то есть всего 1 поток выполнения программы но одновременно идет вот вывод а


Step 7 (S-44757) 2.png

[03:40 - 03:58] с разными файловыми дескрипторами с разными соусами называется мультиплексирование классический подход от использования для мультиплексирования системного вызова селект при этом кот выглядит примерно так у нас есть некоторые списке


[03:58 - 04:17] сокета а на которых мы ожидаем чтения и например на которых мы ожидали запись то есть нас есть 2 списка питоне объект типа list от нас есть список адресов


[04:17 - 04:34] брать сокс сервер работает в бесконечном цикле начале цикла он вызывает функцию селект передает ей нравится а 3 аргумент для проверки ошибок


[04:34 - 04:53] тренер меня там с не нужна вообще результате вызова функции селект мы получаем 3 списка readable и exceptions а список readable это список тех сокета в которых уже есть да


[04:53 - 05:11] то есть это списке список сокетом из которых можно читать а и не быть заблокированным данные есть в сокете соответственно из него можно считать это был это список тех сокета в которой можно писать то есть в них достаточно бо место в буфере чтобы записать данные


[05:11 - 05:27] exception список а то с ошибками но мы пока не будем рассматривать отлично у нас есть допустим а список readable вообще не рассматриваю


[05:27 - 05:43] мы проходим по этому списку и а для каждого элемента из списка readable делаем операцию чтения если данных нет а так скорее всего будет если а пришел


[05:43 - 06:00] spiel сегмент а с флагом fin что с что соединение закрыто мы закрываем и удаляем его из списка на проверку то есть из этого списка далее а иначе мы


[06:00 - 06:16] если вы получили данное мы их обрабатываю в данном случае обработка сводится просто к вывода на экран а после чего цикл повторяется где вся логика сервер откроется


[06:16 - 06:35] сервера кроется вот здесь вот в этой строчке здесь очень простая то просто печать но на самом деле мы получили кусочек данных из какого то сетевого соединения мы из этого кусочка данных можем восстановить за просто пример а дальше вызвать функцию обработки запроса и так далее


[06:35 - 06:54] то есть вот в этом месте происходит основная логика а что мы видим на данном а на данном сниппете мы видим что существенно изменилось поведение программ если раньше программа работала а так скажем


[06:54 - 07:12] сверху вниз то сейчас а программа работает по принципу обработки событий а то есть какой то момент времени у нас появляется список событий вот readable и то фактически список сайтов на которых произошло событие появление да


[07:12 - 07:29] а и мы обрабатываем каждый из этих событий а нюанс в том что данных может быть и достаточно у здесь можно прийти не не запрос целиком и нам потребуется а к этому сокету обратиться повторно но в будущем


Step 7 (S-44757) 3.png

[07:29 - 07:49] а вот и все вот эта конструкция называется event driven разработка разработка основана на событиях для нее характерно следующее это множество открытых файловых дескрипторов то есть вас в каждый момент времени открыто большое количество есть целый список дескрипторов


[07:49 - 08:04] с которыми вы работаете это вот read соксы врать so whats ответил в списке есть большое количество открытых дескрипторов а для выбора готового дескриптор используется


Step 7 (S-44757) 4.png

Step 7 (S-44757) 5.png

[08:04 - 08:19] какой то метод мультиплексирование мы рассматривали селект то есть для того чтобы выбрать те сорта которые готовы к работе используются специальные вызов о том


[08:19 - 08:38] а и вместо последовательного исполнения программы мы получаем а программа распадается на обработчики событий здесь ты видно не очень хорошо но события заключается в том что мы получили какие то данные


Step 7 (S-44757) 6.png

Step 7 (S-44757) 7.png

[08:38 - 08:54] из сокета это может быть а целый фрагмент то есть целый запроса может быть половина запрос и нам нужно обработать именно а полученный фрагмент да а


Step 7 (S-44757) 8.png

[08:54 - 09:09] вместо вместо вызова селект могут использоваться другие системные вызовы у селекта есть 1 недостаток он плохо работает с длинными списками файловый дескриптор


[09:09 - 09:28] а фактически он довольно довольно быстро деградирует с ростом количества дескрипторов открыты поэтому использовать другие системные вызовы как юге пол в зависимости от операционной системы которые позволяют нормально обрабатывать


[09:28 - 09:47] а десятки сотни тысяч файлов скриптов открытых но это не меняет сути а итак это и блокируешь вот вывод разработка какие у нее есть плюсы и минусы по сравнению с подходом


Step 7 (S-44757) 9.png

[09:47 - 10:05] странами потоками а 1 + работает быстро программу не блокируется то есть фактически данный процесс данный процесс 1 которая работает он выжимает максимум что может выжить из ведра


[10:05 - 10:21] с 1 ядра процессора то есть он все свободное время занимается какой то полезной работы если есть ли вообще не что делать а 2 следствие экономия памяти


[10:21 - 10:39] экономия памяти довольно существенно мы для нового клиента фактически не заводим не процесс не потока а каждый новый клиент соответствует какой то структуре то есть вот под нового клиента выделяются новой структуры а как правило это сотен и + какие то связанное да


[10:39 - 10:56] это минимально необходимый объем памяти которой все равно придется выделить а очень эффективно по памяти как следствие мы можем обрабатывать большое количество клиентов одновременно то есть в том числе медленно хлеба долгоживущий соединений


[10:56 - 11:12] то есть такой подход в андрей он позволяет обрабатывать параллельно десятки сотни тысяч соединений а в то время как префорк и стрейзанд сна тысяч их уже будет вести себя очень нестабильно


[11:12 - 11:30] ну за все приходится платить в этого подхода есть а существенные минусы - номер 1 тяжело программировать а аброр а программирование внутри он стиля оно действительно а


[11:30 - 11:49] намного сложнее последовательного программирования для префорк режима когда вас программа распадается на набор функций коллбэков которое вызывают и которой последовательно продвигаются по циклу а структура программы становится сложно


[11:49 - 12:08] 2 - использование блокирующего вызова все портят спор если вы используете какой то блокирующий вызов а у вас есть всего 1 процент всего 1 поток если он заблокируется то а все ваши клиенты будут ждать


[12:08 - 12:26] то есть - а блокирующего ввода вывода с новой силой он опять пишет уже ни 1 клиента всех а но тем не менее а такой подход очень эффективен и практически все современные веб серверах и 7 по производительности


[12:26 - 12:42] практически все современные так или иначе используют этот подход даже те кто изначально него не ориентировались а давайте посмотрим


Step 7 (S-44757) 10.png

[12:42 - 13:00] кто есть кто среде веб серверов то есть э сейчас а мы рассмотрели 3 3 варианта обработки сетевых соединений + имелся теперь посмотрим какие сервера на работу 1 во всем мире в котором мы смотрим это апач


[13:00 - 13:17] самый старый сервер поэтому классическим для режимов работы для по читается префорк режим то есть запуск десятков и сотен воркерах процесс воркер в которой работает а сейчас апаче


[13:17 - 13:34] умеет работать в режиме не только в воркерах снова и инструментов и в комбинированном режиме у почета называется воркер нервной же а но это не меняет суть дела


[13:34 - 13:51] апач написана с использованием языка син это компилируемый язык низкого уровня поэтому апач является в быстром сервер это его принципиально особенность то есть работа в при fork режиме и относительно большая скорость


[13:51 - 14:08] следующий пример а сервера том как и jetty эти сервера написано на языке java и соответственно не в 1 очередь используется для запуска java программ


[14:08 - 14:23] они используют rather это относительно быстро и сервера который позволяет запускать приложения на java но для отдачи скажем статических файлов


[14:23 - 14:39] такие сервера используется крайне редко потому что они делают это неэффективно далее starman и джимми никол а на самом деле за список намного длиннее а таких серверов


[14:39 - 14:54] и в десятке а я выбрал 2 совместно со стартом для языка 1 же рекорд для языка python а это при фок сервера написанный на языке высокого уровня н а


[14:54 - 15:11] поскольку они написаны на языке высокого уровня они априори будут работать медленнее вопрос зачем использовать а такие сервера кто у нас есть апачей которые работают быстро это делается в основном из за простоты интеграции а с языком


[15:11 - 15:29] программирование поскольку допустим старому написано на перле то интеграция с 1 происходит очень легко и просто в отличие от апача а такие используется для запуска бизнес логике то есть сервера конечно они не отдают файл


[15:29 - 15:47] обход чертой находится асинхронной то есть а с неблокирующим ввода вывода а работающая событиях n кингз велосипедист асинхронный сервера написано на компилируемом языке с отвесом они очень быстры


[15:47 - 16:03] а оптимизированы под нагрузку помимо этого есть сервера написаны асинхронный но написаны на языке высокого уровня то есть те которые по идее должны быть медленными а в час это но уже с торнадо


[16:03 - 16:23] ну относительно медленно медленно и чем допустим медленнее чем допустим на linux + этих серверов состоит в том что с 1 стороны они поддерживают большое количество соединений поскольку это синхронность не могут поддерживать десятке


[16:23 - 16:39] соединение с другой стороны они легко интегрируются с языком удобном диванчике языком они позволяют легко их расширять а то есть с 1 стороны очень большое количество соединений с другой стороны я простота расширения


[16:39 - 16:50] как правило такие сервера используются для организации чата либо реал тайм сообщений а либо другого функционала который потребуется персистентные соединения