컴퓨터 과학에서 이벤트 루프(event loop), 메시지 디스패처(message dispatcher), 메시지 루프(message loop), 메시지 펌프(message pump), 런 루프(run loop)는 프로그램이벤트메시지를 대기하다가 디스패치(효율적으로 처리)하는 프로그래밍 구조체이다. 일반적으로 이벤트가 도착할 때까지 요청을 차단하는 일부 내부 또는 외부의 "이벤트 제공자"에게 요청을 한 다음 관련 이벤트 핸들러를 호출한다.(이 때 이벤트를 디스패치한다) 이벤트 제공자가 선택 또는 폴링되는(유닉스 시스템 호출에서 실제로 폴링되지는 않음) 파일 인터페이스를 따르는 경우 이벤트 루프는 반응자와 결합해서 사용할 수 있다. 이벤트 루프는 거의 무조건 메시지 제공자와 비동기식으로 동작한다.

이벤트 루프가 중심 제어 흐름 구조의 프로그램을 형성할 때 이를 메인 루프(main loop) 또는 메인 이벤트 루프(main event loop)라고 할 수 있다. 이벤트 루프가 프로그램 내의 최상위 통제를 받기 때문에 이러한 표현은 적절하다.

사용법

편집

그래픽 사용자 인터페이스가 만연해 있기 때문에 현대의 대부분의 응용 프로그램들은 메인 루프 기능을 갖추고 있다. get_next_message() 루틴은 일반적으로 운영 체제에 의해 제공되며 메시지를 사용할 수 있을 때까지 차단한다. 그러므로 루프는 처리할 대상이 있을 때에만 진입된다.

function main
    initialize()
    while message != quit
        message := get_next_message()
        process_message(message)
    end while
end function

파일 인터페이스

편집

유닉스에서 모든 것이 파일이다 패러다임은 자연적으로 파일 기반 이벤트 루프가 만들어진 계기가 된다. 파일의 읽기/쓰기, 프로세스 간 통신, 네트워크 통신, 장치 제어는 모두 파일 입출력을 통해 수행되며 대상은 파일 서술자에 의해 식별된다. select와 poll 시스템 호출은 파일 서술자 집합이 상태 변화를 감지할 수 있게 한다.(예: 데이터가 읽을 수 있게 될 때)

이를테면 지속적으로 업데이트되는 파일을 읽고 소켓(유닉스 도메인 또는 버클리) 상의 클라이언트와 통신하는 X 윈도 시스템에 내용을 표시하는 프로그램을 고려할 수 있다.

main():
    file_fd = open ("logfile")
    x_fd = open_display ()
    construct_interface ()
    while changed_fds = select ({file_fd, x_fd}):
        if file_fd in changed_fds:
            data = read_from (file_fd)
            append_to_display (data)
            send_repaint_message ()
        if x_fd in changed_fds:
            process_x_messages ()

같이 보기

편집

외부 링크

편집
  NODES