이벤트는 GUI 프로그래밍에만 사용됩니까?


57

이벤트는 GUI 프로그래밍에만 사용됩니까?

이 다른 일이 일어날 때 정상적인 백엔드 프로그래밍에서 어떻게 처리합니까?


6
그건 그렇고, 이벤트 소스는 이벤트 프로그래밍과 완전히 직교하는 개념입니다. 이벤트 소싱의 기본 개념은 시스템의 "상태"를 저장하는 대신 "이벤트"또는 "변경"을 시스템에 저장하는 것입니다. 예를 들어 은행 계좌를 a) 잔액 (STATE) 또는 b) 일련의 거래 (EVENTSOURCE)로 모델링 할 수 있습니다.
ArTs

4
사용법에 따라 "이벤트"는 보통 설탕으로 싸인 콜백 형태입니다. 콜백은 어디에서나 사용됩니다. 관심이 있으시면 검색을 시작하기에 좋은 키워드 일 것입니다.
J ...

10
또한 마이크로 컨트롤러만큼 낮은 수준으로 이동하더라도 하드웨어 인터럽트가 유용하고 논쟁의 여지가없는 필수 기능임을 알게 될 것입니다. 제어 시스템 또는 커피 메이커와 같은 기본 IO에 적합합니다. 이러한 하드웨어 인터럽트는 실제로 이벤트와 본질적으로 다르지 않습니다.
Dan

아니! 실제 예 : Nodejs 이벤트
sampathsris

2
당신은 Windows에 있습니까? 이벤트 뷰어를 확인하십시오. 즐기세요
Marc.2377

답변:


106

아니. Observers를 구현하고 클래스를 수정하기에 매우 편리합니다.

새로운 사용자를 등록하는 방법이 있다고 가정 해 봅시다.

public void Register(user) {
    db.Save(user);
}

그런 다음 누군가 이메일을 보내도록 결정합니다. 우리는 이것을 할 수 있습니다 :

public void Register(user) {
    db.Save(user);
    emailClient.Send(new RegistrationEmail(user));
}

그러나 우리는 방금 수정해야 할 클래스를 수정했습니다. 이 간단한 의사 코드에는 적합하지만 프로덕션 코드에서 광기를 피할 수 있습니다. 이 방법이 새로운 사용자를 만드는 원래 목적과 거의 관련이없는 30 줄의 코드 일 때까지 얼마나 걸립니까?

수업에서 핵심 기능을 수행하고 사용자가 등록한 것을 듣고있는 사람에게 알리는 이벤트를 발생시키는 것이 훨씬 좋으며, 필요한 조치 (예 : 이메일 보내기)를 수행 할 수 있습니다.

public void Register(user) {
    db.Save(user);

    RaiseUserRegisteredEvent(user);
}

이를 통해 코드를 깨끗하고 유연하게 유지할 수 있습니다. 종종 간과되는 OOP 중 하나는 클래스 가 서로 에게 메시지 를 보내는 것 입니다. 이러한 메시지는 이벤트입니다.


37
나는 이것을 읽고 우리의 "예약 만들기"코드를 생각하고 더 좋은 곳을 위해 오랫동안 오랫동안 울고 있습니다 : '(
sara

1
+1, 좋은 답변입니다. 탄젠트 질문 (이것은 나를 조금 귀찮게했습니다) : 대문자로 메소드 이름 (등록, 저장 및 보내기)을 시작한 특별한 이유가 있습니까? 물론 이것은이 답변의 유용성에 영향을 미치지 않습니다.
페드로 A

14
@Hamsteriffic 저는 주로 C # 개발자이며 일반적으로 인정되는 규칙입니다. 다른 이유는 없습니다.
RubberDuck

6
@Hamsterifficas 또한 추가로, 당신은 lowerCase라고 부르지 만 중간에 대문자를 포함하는 것은 종종 camelCase라고합니다. 중간에는 혹이 있기 때문입니다. 그것은 소문자 단어가 파이썬과 대부분의 쉘 언어에 익숙한 밑줄로 구분되는 snake_case와 구별됩니다.
Aaron

5
이벤트는 이러한 메시지의 한 유형 입니다. 메소드 호출도 메시지 전달로 간주됩니다.
jpmc26 2016 년

53

아니.

비 GUI 논리에서 사용되는 이벤트의 전형적인 예는 데이터베이스 트리거입니다.

트리거는 주어진 이벤트가 발생할 때 실행되는 코드입니다 (INSERT, DELETE 등). 나에게 이벤트처럼 보인다.

이것은 이벤트의 위키 백과 정의입니다.

컴퓨팅에서, 이벤트는 소프트웨어에 의해 처리 될 수있는 소프트웨어에 의해 인식되는 동작 또는 발생이다. 컴퓨터 이벤트는 시스템, 사용자 또는 다른 방법으로 생성하거나 트리거 할 수 있습니다. 일반적으로 이벤트는 프로그램 흐름과 동 기적으로 처리됩니다. 즉, 소프트웨어에는 이벤트가 처리되는 하나 이상의 전용 장소, 종종 이벤트 루프가있을 수 있습니다. 이벤트 소스에는 예를 들어 키보드의 키 입력을 통해 소프트웨어와 상호 작용할 수있는 사용자가 포함됩니다. 다른 소스는 타이머와 같은 하드웨어 장치입니다. 소프트웨어는 또한 예를 들어 작업 완료를 알리기 위해 자체 이벤트 세트를 이벤트 루프로 트리거 할 수 있습니다. 이벤트에 응답하여 동작을 변경하는 소프트웨어는 종종 대화 형이라는 목표를 가진 이벤트 중심이라고합니다.

모든 이벤트가 사용자 생성되는 것은 아닙니다. 일부는 앞에서 언급 한 데이터베이스 INSERT의 crontab과 같은 타이머에 의해 생성됩니다.

이 정의는 또한 일부 프로그램이나 시스템이 "대화 형을 목표로하는 이벤트 중심"이라고 말하며,이를 통해 이벤트의 목적 또는 유용성이 전적으로 GUI가 아닌 대화 형 기능을 제공한다는 것을 알 수 있습니다. 반드시 GUI는 아니지만 CLI 프로그램도 대화식이 될 수 있습니다.


2
데이터베이스 트리거에 대해들을 때 항상 이것을 생각합니다 : thecodelesscode.com/case/42
Almo

전 DBA 개발자로서 저는 사람들이 더 넓은 DB 성능을 고려하지 않고 트리거 사용에 대해 이야기 할 때마다 울었습니다.
Three Value Logic

28

이벤트 기반 프로그래밍은 실제로 고성능 서버 프로그래밍에도 사용됩니다.

일반적인 서버 워크로드에서 결과를 처리하는 데 많은 시간이 실제로 I / O에서 발생합니다. 예를 들어 (7200RPM) 하드 디스크 드라이브에서 데이터를 가져 오는 데 최대 8.3ms가 걸릴 수 있습니다. 최신 GHz 프로세서의 경우 최대 백만 클럭 사이클에 해당합니다. CPU가 매번 데이터를 기다리면 (아무것도하지 않음) 많은 클럭 사이클을 잃게됩니다.

전통적인 프로그래밍 기술은 여러 스레드 를 도입하여이 문제를 해결 합니다 . CPU는 수백 개의 스레드를 동시에 실행하려고합니다. 그러나이 모델의 문제점은 CPU가 스레드를 전환 할 때마다 컨텍스트 전환에 수백 개의 클럭 사이클이 필요하다는 것 입니다. 컨텍스트 스위치는 CPU가 스레드 로컬 메모리를 CPU 레지스터에 복사 하고 이전 스레드의 레지스터 / 상태를 RAM에 저장하는 경우입니다.

또한 각 스레드는 상태를 저장하기 위해 특정 양의 메모리를 사용해야합니다.

오늘날에는 단일 스레드가 있고 루프에서 실행되는 서버에 대한 푸시가 있습니다. 그런 다음 작업 조각이 메시지 펌프 로 푸시되어 단일 스레드의 큐 역할을합니다 (UI 스레드와 유사). CPU는 작업이 완료되기를 기다리는 대신 하드 디스크 드라이브 액세스와 같은 작업에 콜백 이벤트를 설정합니다. 컨텍스트 전환을 줄입니다.

이러한 서버의 가장 좋은 예는 Node.js 이며, 이는 겸손한 하드웨어로 백만 개의 동시 연결을 처리 할 수있는 반면 Java / Tomcat 서버는 수천에서 어려움을 겪습니다.


2
"최소의 하드웨어"는 약간 오해의 소지가 있습니다. OS에서 사용하는 것 외에 노드에 8GB 이상이 필요합니다. 메모리가 많으면 Tomcat은 수천 개의 연결을 쉽게 처리 할 수 ​​있습니다. 물론 큰 차이가 있지만 1000x는 아닙니다.
Paul Draper

@PaulDraper 아니요. 그리고 그렇지 않습니다. 8000 스레드 스택에만 8GB +가 필요합니다. 그것은 큰 차이입니다.
ArTs

3
8GB 이외의 @PaulDraper는 서버 표준에 따라 매우 적당합니다. 나는 128GB의 램을 가진 머신에서 작업했고 완전히로드되지 않았습니다. 램 스틱은 전체 기계보다 비쌉니다.
ArTs

스택 크기가 무엇인지에 달려 있습니다. Oracle / OpenJDK는 대부분의 플랫폼에서 64 비트의 경우 1MB, 32 비트의 경우 512K로 기본 설정됩니다. 기본값을 그대로 사용하면 정확합니다. 그러나 기본값은 1M 노드 연결 방법이 아닙니다.) 어쨌든 128K는 충분합니다. 당신은 훨씬 더 멀리 도망 갈 수 있습니다. 8000 스레드의 경우 1GB의 스택 공간입니다.
Paul Draper

6
당신은 착각입니다. 기본 스택 크기를 사용하더라도 8GiB의 가상 메모리 만 필요 합니다. 메모리는 필요에 따라 즉시 커밋됩니다. 실제로 추가 메모리를 사용 하지 않는 한 일반적으로 스택 당 단일 페이지 만 필요합니다 . 실제로 이러한 시스템의 대부분의 스레드에는 (보통) 64kiB 스택 만 있습니다. 가상 메모리 사용량은 32 비트 OS에서는 큰 문제이지만 64 비트에서는 그다지 많지 않습니다. TCP 포트 소진과 같은 다른 한계에 더 빨리 도달합니다. :) 노드의 "의사 스택"이 어디에 저장되어 있다고 생각하십니까? 맞습니다.
Luaan

10

이벤트는 네트워크 프로그래밍 (예 : Nginx)에서 많이 사용되어 값 비싼 통화 대기 루프를 피하고 대신 특정 작업이 가능한시기 (I / O, 긴급 데이터 등)를 정확하게 알 수있는 깔끔한 인터페이스를 제공합니다 . 이것은 또한 C10k 문제에 대한 해결책 입니다.

기본 아이디어는 이벤트, 모든 이벤트 또는 특히 관심있는 일부 (예를 들어 읽을 수있는 데이터)를 모니터링하기 위해 OS에 소켓 세트 (예 : 네트워크 연결)를 제공하는 것입니다. 이러한 활동이 목록의 소켓 중 하나에서 운영 체제에 의해 감지되면 API에서 찾고 있던 이벤트에 대한 알림을 받게됩니다. API에서 발생한 이벤트를 정렬하고 그에 따라 조치를 취해야합니다. .

이제 이것은 저수준의 추상적 인 관점이며, 더 잘 확장하기가 까다 롭습니다. 그러나 크로스 플랫폼 방식으로 처리하는 상위 레벨의 프레임 워크가 많이 있습니다 .Twisted for Python, Boost.Asio for C ++ 또는 libevent for C가 떠 오릅니다.


+1 "고가 통화 중 대기 루프": 즉, 일부 비 활동 (대기)과 관련된 프로세스 (메시지 또는 이벤트) 간의 동기화뿐만 아니라 병렬 프로세스에서도 유용합니다. 많은 실제 세계가 작동합니다.
fr13d

네트워킹이 존재하기 전에 소켓이 원래 단일 시스템에서 IPC의 형태로 설계되었다는 것을 알아 두는 것이 흥미 롭습니다.

5

임베디드 시스템은 명시 적으로 프로그래밍되지 않더라도 거의 항상 본질적으로 이벤트 중심입니다.

이러한 이벤트는 하드웨어 인터럽트, 버튼 누름, 기간 아날로그-디지털 판독 값, 타이머 만료 등과 같은 것에서 발생합니다.

저전력 임베디드 시스템은 이벤트 중심 일 가능성이 훨씬 높습니다. 그들은 대부분의 시간을 잠들고 (CPU는 저전력 모드에서 잠자기), 무언가 일어나기를 기다립니다 ( "뭔가"는 이벤트입니다).

이벤트 중심 임베디드 시스템의 가장 일반적이고 널리 사용되는 프레임 워크 중 하나는 Quantum Platform (QP)입니다 (QP는 Linux, Windows 및 모든 유닉스 계열 OS에서도 작동합니다). 상태 머신은 이벤트 중심 프로그래밍에 자연스럽게 적합합니다. 프로그램은 일반적인 의미에서 "순차적"이 아니기 때문에 시스템 상태 및 현재 이벤트에 따라 호출되는 "콜백"세트입니다.


3

이벤트 메시지 Gregor Hohpe.

이벤트 중심 아키텍처 Gregor Hohpe.

SEDA 아키텍처 , 웨일스 어, 컬러, 브루어.

다른 일이 일어날 때 정상적인 백엔드 프로그래밍에서 어떻게 처리합니까?

유한 상태 머신 은 하나의 일반적인 접근 방식입니다

Given(State.A)
When(Event.B)
Then(State.C)
    .and(Consequences.D)

2
1, 이것은 실제로 일관된 답변이 아니며, 2, FSM은 이벤트 사용의 좋은 예가 아닙니다.
whatsisname

1
FSM. 나는 파스타 파파 종교가 많은 사건들을 관찰 할 것이라 확신합니다 ;-)
fr13d

0

임베디드 시스템에서 이벤트는 인터럽트 중에 발생합니다. 타이머에서 I / O에 이르기까지 많은 인터럽트 소스가 있습니다.

또한 RTOS에도 이벤트가있을 수 있습니다. 한 가지 예는 다른 작업에서 메시지를 기다리는 것입니다.


0

임베디드 시스템이 아니지만 C #에서 수행 한 작업은 SCADA 시스템이었습니다. 로드가 시스템 생성 이벤트의 일부로 언로드되고 다른 부분이 데이터베이스에 새로운 상태를 기록 할 때웨어 하우스에서 발생한 것과 연관된 많은 이벤트가있었습니다. 물론 GUI 클라이언트가 있었지만웨어 하우스의 상태를 반영한 ​​데이터베이스의 상태 만 표시했습니다. 따라서 이벤트 및 스레딩을 기반으로하는 백엔드 서버 소프트웨어였습니다. 개발하기가 매우 어렵습니다.

https://ko.wikipedia.org/wiki/SCADA

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.