Событийно. Событийно-ориентированное программирование. Событийноориентированное программирование
Скачать 0.56 Mb.
|
Событийно-ориентированное программированиеСобытийно-ориентированное программирование, СОП, создание событийно-управляемых программ, event-driven programmingПарадигма программирования, в которой выполнение программы определяется событиями - действиями пользователя (клавиатура, мышь), сообщениями других программ и потоков, событиями операционной системы (например, поступлением сетевого пакета). СОП можно также определить как способ построения компьютерной программы, при котором в коде (как правило, в головной функции программы) явным образом выделяется главный цикл приложения, тело которого состоит из двух частей: выборки события и обработки события. Как правило, в реальных задачах оказывается недопустимым длительное выполнение обработчика события, поскольку при этом программа не может реагировать на другие события. В связи с этим при написании событийно-ориентированных программ часто применяют автономное програмирование Сфера применения событийно-ориентированного программированияСобытийно-ориентированное программирование, как правило, применяется в следующих случаях: Построение пользовательских интерфейсов (в том числе графических); Создание серверных приложений; Моделирование сложных систем; Параллельные вычисления; Автоматические системы управления, SCADA; Программирование игр, в которых осуществляется управление множеством объектов. Применение событийно-ориентированного программирования в серверных приложенияхСобытийно-ориентированное программирование применяется в серверных приложениях для решения проблемы масштабирования на 10 тыс. одновременных соединений и более. Обычно это делается в среде версионных, а не транзакционных систем. В серверах, построенных по модели «один поток на соединение», проблемы с масштабируемостью возникают по следующим причинам: слишком велики накладные расходы на структуры данных операционной системы, необходимые для описания одной задачи (сегмент состояния задачи, стек); слишком велики накладные расходы на переключение контекстов. Серверное приложение при событийно-ориентированном программировании реализуется на системном вызове, получающем события одновременно от многих дескрипторов (мультиплексирование). При обработке событий используются исключительно неблокирующие операции ввода-вывода, чтобы ни один дескриптор не препятствовал обработке событий от других дескрипторов. Применение событийно-ориентированного программирования в настольных приложенияхВ современных языках программирования события и обработчики событий являются центральным звеном реализации графического интерфейса пользователя. Рассмотрим, к примеру, взаимодействие программы с событиями от мыши. Нажатие правой клавиши мыши вызывает системное прерывание, запускающее определенную процедуру внутри операционной системы. В этой процедуре происходит поиск окна, находящегося под курсором мыши. Если окно найдено, то данное событие посылается в очередь обработки сообщений этого окна. Далее, в зависимости от типа окна, могут генерироваться дополнительные события. Например, если окно является кнопкой (в Windows все графические элементы являются окнами), то дополнительно генерируется событие нажатия на кнопку. Отличие последнего события в том, что оно более абстрактно, а именно, не содержит координат курсора, а говорит просто о том, что было произведено нажатие на данную кнопку. Обработчик события может выглядеть следующим образом (на примере C#): private void button1_Click (object sender, EventArgs e) { MessageBox.Show (“Была нажата кнопка”); } Здесь обработчик события представляет собой процедуру, в которую передается параметр sender, как правило содержащий указатель на источник события. Это позволяет использовать одну и ту же процедуру для обработки событий от нескольких кнопок, различая их по этому параметру. Инструменты и библиотеки для событийно-ориентированного программированияNode.js - событийно-ориентированный I/O фреймворк на JavaScript движке V8 Cocoa & Objective-C - рефлексивный объектно-ориентированный язык программирования, добавляющий сообщения в стиле Smalltalk в язык Си. GLib Gui4Cli - событийно-ориентированный язык программирования для Windows libsigc++ libevent POCO libasync, часть библиотек sfs и sfslite - эффективная событийная библиотека для C++ Perl Object Environment AnyEvent, EV — модули на Perl для событийно-ориентированного программирования PRADO - компонентный событийно-ориентированный инструмент для Web-программирования на PHP5 Tcl Twisted, Python Qt - кроссплатформенная библиотека виджетов для C++, основанная на модели управления событиями. Существует сокращённая версия, называемая Qt/Console, из которой исключён код поддержки виджетов, и представляющий собой управляемый событиями фреймворк, в который также включены некоторые дополнительные средства, вроде кроссплатформенной работы с сетью, многопоточности и работы с XML. QP — семейство открытых событийно-ориентированных окружений для встроенных систем реального времени Simple Unix Events a.k.a. SUE - простая объектно-ориентированная библиотека для построения событийно-ориентированных программ под Unix на языке C++. Что такое поток и многопоточность?Поток – это самая маленькая единица выполнения, которая может быть выполнена в операционной системе. Это не сама программа, но она запускается внутри программы. Другими словами, потоки не являются независимыми друг от друга. Каждый поток разделяет раздел кода, раздел данных и т. Д. С другими потоками. Они также известны как легкие процессы. Поток состоит из следующих компонентов – Счетчик программ, состоящий из адреса следующей исполняемой инструкции стек Набор регистров Уникальный идентификатор Счетчик программ, состоящий из адреса следующей исполняемой инструкции стек Набор регистров Уникальный идентификатор Многопоточность , с другой стороны, – это способность процессора управлять использованием операционной системы, выполняя одновременно несколько потоков. Основная идея многопоточности заключается в достижении параллелизма путем разделения процесса на несколько потоков. Понятие многопоточности можно понять с помощью следующего примера Пример Предположим, мы запускаем определенный процесс, в котором мы открываем MS Word, чтобы вводить в него содержимое. Один поток будет назначен для открытия MS Word, а другой поток потребуется для ввода содержимого в нем. И теперь, если мы хотим отредактировать существующий, тогда потребуется другой поток, чтобы выполнить задачу редактирования и так далее. Что такое процесс и многопроцессорность?Процесс определяется как объект, который представляет собой базовую единицу работы, которая должна быть реализована в системе. Проще говоря, мы пишем наши компьютерные программы в текстовом файле, и когда мы выполняем эту программу, она становится процессом, который выполняет все задачи, упомянутые в программе. В течение жизненного цикла процесса он проходит через различные этапы – Пуск, Готов, Запуск, Ожидание и Завершение. Следующая диаграмма показывает различные этапы процесса – Процесс может иметь только один поток, называемый основным потоком, или несколько потоков, имеющих свой собственный набор регистров, счетчик программ и стек. Следующая диаграмма покажет нам разницу – С другой стороны, многопроцессорность – это использование двух или более процессорных блоков в одной компьютерной системе. Наша основная цель – максимально использовать потенциал нашего оборудования. Чтобы достичь этого, нам нужно использовать полное количество процессорных ядер, доступных в нашей компьютерной системе. Многопроцессорная обработка – лучший подход для этого. Python – один из самых популярных языков программирования. Ниже приведены некоторые причины, которые делают его пригодным для одновременных приложений GIL (глобальная блокировка интерпретатора)Это одна из самых противоречивых тем в мире Python. В CPython GIL является мьютексом – блокировкой взаимного исключения, которая обеспечивает безопасность потоков. Другими словами, мы можем сказать, что GIL препятствует параллельному выполнению кода Python несколькими потоками. Блокировка может удерживаться только одним потоком за раз, и если мы хотим выполнить поток, он должен сначала получить блокировку. Диаграмма, показанная ниже, поможет вам понять работу GIL. Однако в Python есть некоторые библиотеки и реализации, такие как Numpy, Jpython и IronPytbhon. Эти библиотеки работают без какого-либо взаимодействия с GIL. |