파비의 매일매일 공부기록

파이썬 동시성 프로그래밍 - #9 이벤트 기반 프로그래밍 본문

Study/Python

파이썬 동시성 프로그래밍 - #9 이벤트 기반 프로그래밍

fabichoi 2021. 8. 16. 23:30

이번장은 이벤트 기반 프로그래밍에 대한 설명이다. 이벤트 기반 프로그래밍은 이벤트에 초 저을 맞춘 형태이다. 프로그래밍 관점에서 '이벤트'의 정의를 정확히 이해하고 요약할 것이다.

 

이벤트 기반 파이썬 프로그램에 주로 사용되는 asyncio 모듈 소개 및 asyncio 프로그래밍 세계도 소개한다.

 

이벤트 기반 프로그래밍 : 일반적으로 이벤트에 반응하는 일정한 이벤트 루프가 있다. 이벤트 루프가 시작되면 어떤 것이 실행되고 그 순서가 어떻게 되는지 결정하는 시스템상에서 필요한 이벤트가 내려진다. 키보드 이벤트가 간단한 예이다. 프로그램이 시작되고 '대기' 상태에 돌입한다. 이는 특정 이벤트나 시스템 충돌 발생으로 인한 프로그램 종료 때까지 무한정 계속됨. '대기' 상태에서는 계속 이벤트를 받아들이고 이벤트 핸들러에게 전달한다. 

- 이벤트 루프 : 이벤트 루프 안에서 할 수 있는 일은 다음과 같다.

  = 호출 등록, 실행, 취소하기

  = 하위 프로세스 및 외부 프로그램에서 관련 통신 실행하기

  = 스레드 풀에 가장 많이 호출되는 함수 지정하기

모든 이벤트 루프는 필수적으로 주어진 이벤트 타입과 매치된 함수가 연결되기 전에 발생하는 이벤트를 기다려야 함. 이벤트는 발생할 때 일어나도록 미리 구성해둔 함수와 매치됨.

 

asyncio : 3.4 버전에서 소개됨. 코 루틴(coroutine)을 활용한 단일 스레드 기반 및 동시성 프로그램을 쉽게 작성해주는 모듈. 소켓과 그 외 자원들을 멀티플렉싱 I/O 접근 작업을 해주며 비교적 쉽게 스레드 세이프 프로그램을 작성할 수 있도록 동기화 작업도 제공하고 있음. 이후에는 소스와 함께 각 개념(이벤트 루프, 테스크, 테스크 함수, 퓨처, 코루틴, 트랜스포트, 프로토콜, 코 루틴 간의 동기화, 세마포어와 한정된 세마포어, 하위 프로세스)들에 대한 자세한 설명이 소개됨.

 

asyncio 프로그램 디버깅 : 친절하게 디버깅 모드를 제공. 시스템 코드를 많이 고칠 필요 없이 디버깅 작업이 가능하도록 도와줌.

 

트위스티드 : 웹 서버, 메일 클라이언트, 하위 시스템 등 대규모 프로젝트에 사용되는 강력한 이벤트 기반 네트워킹 엔진임. 복잡한 코드 없이 강력한 프로그램을 생성할 수 있고 로우 레벨 API를 모두 제공하고 있음. 비동기 및 이벤트 기반 형태로 디자인돼 asyncio 모듈과 비슷하다. 간단한 웹 서버 예제에 대해 소개한다.

 

gevent : gevent 네트워크 라이브러리는 코루틴의 상단을 구성. 트위스티드와 비교해 비슷한 면이 있으며 이벤트 기반 파이썬 앱을 구성할 수 있는 함수를 제공.

- 특징 : 빠른 이벤트 루프, greenlet 패키지를 기반으로 한 가벼운 실행 단위, 파이썬 기본 라이브러리에서 개념을 재사용할 수 있는 API, 협동적 소켓과 SSL 모듈, TCP/UDP/HTTP 서버, 스레드 풀, 하위 프로세스 지원

- 이벤트 루프 : asyncio 모듈과 마찬가지로 이벤트 루프 개념 활용. 내부에 등록된 상태로 이벤트를 다루기에 효율적인 디자인이 가능. 이벤트로 인한 자원 낭비를 줄이고 이벤트의 실제 진행에 집중하며 OS가 이벤트 알림의 전달을 처리.

- greenlet : 협업 스케줄링된 C언어로 작성한 매우 가벼운 코 루틴. 이는 매우 간단한 스레드와 비슷한 객체를 제공해 멀티스레드 동작 없이 파이썬 프로그램에서 동시성 프로그램이 가능. pseudo 스레드는 greenlet 인스턴스 생성을 바탕으로 만들고, 시작 메서드를 호출. 그 후 코드를 실행하고 유효 상태를 거쳐 그 밖의 스레드가 차지. 이러한 반복 사이클은 프로그램의 타깃이 완료되고 종료될 때까지 진행.

 

이번장도 대부분 예제를 통해 설명되어 있어서 이해하기가 편했다.

 

 

반응형
Comments