Событийно-ориентированное программирование
Событийно-ориентированное программирование (англ. event-driven programming) — это способ построения компьютерной программы, при котором в коде (как правило, в головной функции программы) явным образом выделяется главный цикл приложения, тело которого состоит из двух частей: выборки события и обработки события.
Как правило, в реальных задачах оказывается недопустимым длительное выполнение обработчика события, поскольку при этом программа не может реагировать на другие события. В связи с этим при написании событийно-ориентированных программ часто применяют автоматное программирование.
Сфера применения
Событийно-ориентированное программирование, как правило, применяется в двух случаях:
- при построении пользовательских интерфейсов (в том числе ГПИ)
- при создании серверных приложений в случае, если по тем или иным причинам нежелательно порождение обслуживающих процессов
Применение в серверных приложениях
Событийно-ориентированное программирование применяется в серверных приложениях для решения проблемы масштабирования на 10000 одновременных соединений и более.
В серверах, построенных по модели "один поток на соединение", проблемы с масштабируемостью возникают по следующим причинам:
- слишком велики накладные расходы на структуры данных операционной системы, необходимые для описания одной задачи (сегмент состояния задачи, стэк);
- слишком велики накладные расходы на переключение контекстов.
Филосовской предпосылкой для отказа от потоковой модели серверов может служить высказывание Алана Кокса: "Компьютер –- это конечный автомат. Потоковое программирование нужно тем, кто не умеет программировать конечные автоматы" [1]
Серверное приложение при событийно-ориентированном программированим реализуется на системном вызове, получающем события одновременно от многих дескрипторов (мультиплексирование). При обработке событий используются исключительно неблокирующие операции ввода-вывода, чтобы ни один дескриптор не препятствовал обработке событий от других дескрипторов.
Мультиплексирование
Для мультиплексирования соединений могут быть использованы следующие средства операционной системы:
- select (большинство UNIX систем). Плохо масштабируется, из-за того, что список дескрипторов представлен в виде битовой карты;
- poll и epoll (Linux);
- kqueue (FreeBSD);
- /dev/poll (Solaris);
- IO completion port (Window);
- POSIX AIO на текущий момент только для операций дискового ввода-вывода.
Примеры реализаций
Инструменты и библиотеки
- событийно-ориентированная обработка из «Azuki framework»
- Событийная библиотека языка Eiffel
- Cocoa & Objective-C, рефлексивный объектно-ориентированный язык программирования, добавляющий сообщения в стиле Smalltalk в язык Си.
- GLib
- Gui4Cli, событийно-ориентированный язык программирования для Windows
- event loop management library
- libsigc++
- libevent
- libasync, часть библиотек sfs и sfslite [1], эффективная событийная библиотека для C++
- Perl Object Environment
- PRADO, компонентный событийно-ориентированный инструмент для Web-программирования на PHP 5
- Tcl
- Twisted, Python
- The Qt Toolkit, a cross-platform GUI toolkit for C++ based on an event-driven model. A version called Qt/Console exists which omits the GUI features, but still includes the event-handling framework and some other features like cross-platform networking, threading, and XML libraries.
- QP — семейство открытых событийно-ориентированных окружений для встроенных систем реального времени
- Simple Unix Events a.k.a. SUE, простая объектно-ориентированная библиотека для построения событийно-ориентированных программ под Unix на языке C++.
См. также
англоязычные источники
- описание из Portland Pattern Repository
- Event-Driven Programming: Introduction, Tutorial, History - учебное пособие Стефана Ферга (Stephen Ferg)
- Event Driven Programming учебное пособие Алана Голда (Alan Gauld)
- Martin Fowler. Event Collaboration
- Ben Watson. Transitioning from Structured to Event-Driven Programming
- Jonathan Simon. Rethinking Swing Threading
- Chris McDonald. The event driven programming style
- Christopher Diggins. Event Driven Programming using Template Specialization
- Stefan Schiffer and Joachim Hans Fröhlich. Concepts and Architecture of Vista - a Multiparadigm Programming Environment
- Event-Driven Programming and Agents
- LabWindows/CVI Resources
- Comment by Tim Boudreau
- Complex Event Processing and Service Oriented Architecture
- Event-driven programming and SOA: Jack van Hoof. How EDA extends SOA and why it is important;;
- Пример с открытым кодом: Distributed Publish/Subscribe Event System
- Событийно-ориентированное программирование на языке Java: Rex Youung. Jsasb
материалы на русском
- Н.Н.Непейвода. Стили и методы программирования. курс лекций. учебное пособие. — М.: Интернет-университет информационных технологий, 2005. — С. 213—222. — 316 с. — ISBN 5-9556-0023-X.
- О.В. Ануфриев. О методике обучения основам событийного программирования
- А. П. Полищук, С. А. Семериков. Программирование в X Window средствами Free Pascal