Файл: Событийноориентированное программирование.pptx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 27.03.2024

Просмотров: 14

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Событийно-ориентированное программирование

Событийно-ориентированное программирование, СОП, создание событийно-управляемых программ, 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.