Событийно-ориентированное программирование: различия между версиями
[непроверенная версия] | [отпатрулированная версия] |
Alecs.bot (обсуждение | вклад) м робот добавил: simple:Event-driven programming |
|||
Строка 27: | Строка 27: | ||
* [[/dev/poll]] ([[Solaris]]); |
* [[/dev/poll]] ([[Solaris]]); |
||
* [[IO completion port]] ([[Window]]); |
* [[IO completion port]] ([[Window]]); |
||
* [[POSIX AIO]] на текущий момент только для операций дискового ввода-вывода |
* [[POSIX AIO]] на текущий момент только для операций дискового ввода-вывода; |
||
* [[io_submit]] и [[eventfd]] для операций дискового ввода-вывода. |
|||
=== Примеры реализаций === |
=== Примеры реализаций === |
Версия от 15:11, 17 ноября 2008
Событийно-ориентированное программирование (англ. event-driven programming) — это способ построения компьютерной программы, при котором в коде (как правило, в головной функции программы) явным образом выделяется главный цикл приложения, тело которого состоит из двух частей: выборки события и обработки события.
Как правило, в реальных задачах оказывается недопустимым длительное выполнение обработчика события, поскольку при этом программа не может реагировать на другие события. В связи с этим при написании событийно-ориентированных программ часто применяют автоматное программирование.
Сфера применения
Событийно-ориентированное программирование, как правило, применяется в трех случаях:
- при построении пользовательских интерфейсов (в том числе ГПИ);
- при создании серверных приложений в случае, если по тем или иным причинам нежелательно порождение обслуживающих процессов;
- при программировании игр, в которых осуществляется управление множеством объектов.
Применение в серверных приложениях
Событийно-ориентированное программирование применяется в серверных приложениях для решения проблемы масштабирования на 10000 одновременных соединений и более.
В серверах, построенных по модели «один поток на соединение», проблемы с масштабируемостью возникают по следующим причинам:
- слишком велики накладные расходы на структуры данных операционной системы, необходимые для описания одной задачи (сегмент состояния задачи, стек);
- слишком велики накладные расходы на переключение контекстов.
Философской предпосылкой для отказа от потоковой модели серверов может служить высказывание Алана Кокса: «Компьютер — это конечный автомат. Потоковое программирование нужно тем, кто не умеет программировать конечные автоматы» [1]
Серверное приложение при событийно-ориентированном программировании реализуется на системном вызове, получающем события одновременно от многих дескрипторов (мультиплексирование). При обработке событий используются исключительно неблокирующие операции ввода-вывода, чтобы ни один дескриптор не препятствовал обработке событий от других дескрипторов.
Мультиплексирование
Для мультиплексирования соединений могут быть использованы следующие средства операционной системы:
- select (большинство UNIX систем). Плохо масштабируется, из-за того, что список дескрипторов представлен в виде битовой карты;
- poll и epoll (Linux);
- kqueue (FreeBSD);
- /dev/poll (Solaris);
- IO completion port (Window);
- POSIX AIO на текущий момент только для операций дискового ввода-вывода;
- io_submit и eventfd для операций дискового ввода-вывода.
Примеры реализаций
Инструменты и библиотеки
- событийно-ориентированная обработка из «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