프로그래밍/파이썬

[파이썬] eBest Xing api 실시간조회, 스레드 설계 구현 (2)

말춘이 2020. 2. 22. 15:25
반응형

 

 

GitHub - malchooni/EBestAPI_Python: 파이썬 학습목적의 이베스트 API 구현

파이썬 학습목적의 이베스트 API 구현. Contribute to malchooni/EBestAPI_Python development by creating an account on GitHub.

github.com

 

 

[파이썬] eBest Xing api 실시간조회, 멀티스레드 설계 (1)

[파이썬] eBest Xing api 실시간조회, 스레드 설계 구현 (2)

[파이썬] eBest Xing api 실시간조회, ThreadJob 구현 (3)

[파이썬] eBest Xing api 실시간조회, ConnectionManager 구현 (4)

[파이썬] eBest Xing api 실시간조회, QueryThreadJob 구현 (5)

[파이썬] eBest Xing api 실시간조회, NWS 뉴스 요청 구현 (6)

[파이썬] eBest Xing api 실시간조회, S3_ 코스피체결 구현 (7)

[파이썬] eBest Xing api 실시간조회, 테스트 및 실행 화면 (8)

 

 

  앞서 설계한 큰 그림을 기반으로 병행 실행의 기반이 될 추상화 클래스를 설계, 구현해보겠다.
  스레드의 라이프사이클을 설계하고 구현하는 단계이다.

 

  스레드 간의 연결고리로 많이 사용하는 방법이 ‘생산자-소비자 패턴’이라고 이전 포스트에서 언급했었다.
명령어를 제공하는 스레드를 생산자라 하면 이를 받아 수행하고 처리하는 스레드가 소비자이다. 이 소비자(스레드)의 시작은 초기화 메서드로 시작된다. 스레드가 생성되고 본격적으로 Queue에서 명령어를 꺼내기 전, 처리에 필요한 객체 생성, 리소스 생성 등 필요한 작업을 우선 실행한다. 이후 Queue를 지속적으로 열람하여 생산자로부터 들어온 명령어가 있는지 확인한다.

  이를 액티비티 다이어그램으로 표현하면 아래와 같다.

 

  1. Job 초기화
  Queue에 들어온 명령어를 수행하기 앞서 필요한 명령어 수행에 필요한 객체를 생성하는 등을 할 수 있는 초기화 구문이다. 이 구문에서 win32com.client.DispatchWithEvents 함수를 이용하여 Xing API의 특정 객체를 얻어올 수 있다. 이 작업은 꼭 스레드의 시작 지점에서 이루어져야 한다.

  2. 지속적인 Queue 확인
  소비자 스레드가 명령어를 처리하기 위해 Queue에 들어온 명령어가 있는지 지속적으로 확인한다. 이때 queue.Queue().get() 함수를 통해 블록을 걸어야 하고 또한 타임아웃을 걸어야 한다. 그 이유는 Xing API 객체를 생성할 때 이벤트 리스너 클래스를 같이 등록하는데, 이 이벤트 리스너가 수행할 시간을 주기 위해서 queue.Queue().get() 함수에 블록만 걸지 말고 특정 시간 타임아웃도 같이 걸어줘야 한다. 만약 타임아웃을 걸지 않았을 경우 이벤트 리스너 클래스가 이벤트 수신 시 수행할 시간이 없긴 때문에 해당 이벤트에 행이 걸려버린다, 혹은 다음 명령어가 들어오기 전까지 수행되지 못할 것이다.

  3. 명령어 수행
  Queue에 들어온 명령어가 있을 경우 해당 명령어를 분기해서 알맞은 오퍼레이션을 수행한다.

  4. SHUTDOWN 명령어 수행
  라이프사이클에 중요한 부분 중 하나이다, 해당 스레드의 작업을 마감할 때 올바른 마감을 위해 해당 함수에 정의한다. 예를 들면 DBConnection close 등, 리소스의 올바른 해제 작업이 필요할 것이다.

 

  이렇게 명령어 소비자의 라이프사이클을 설계하고 이를 기반으로 클래스 다이어그램을 그려보겠다.

 

  ThreadJob 추상화 클래스를 기준으로 성격이 다른 ConnectionManager와 QueryJob을 분류하였다. 이베스트에게 요청 및 응답받을 QueryJob은 공통기능만 묶어뒀고 각각의 Query(NWS, S3_)는 QueryJob 추상화 클래스를 상속받아 세부 구현이 가능하게 설계하였다.

 

  1) ThreadJob 주요 메서드
– _init() : 스레드 수행 시 최초 호출
– _execute() : 스레드 수행 메서드
– _shutdown() : 스레드 종료 시 호출
– _waiting_queue() : Queue에 명령어가 꺼내질 때까지 기다리는 메서드
– _push_command() : 명령어를 Queue 넣을 수 있는 메서드
– shutdown_call() : 스레드 종료 명령어를 큐에 담는 메서드

 

  2) QueryThreadJob 주요 메서드
– _operation_init() : 명령어를 수행할 오퍼레이션 초기화
– _operation_call() : 오퍼레이션 호출 시 수행될 로직

 

  3) ConnectionManager 주요 메서드
– _xa_connect() : 서버 연결
– _xa_disconnect() : 서버 연결 끊기
– waiting_login() : 로그인 대기 메서드 (블록)
– waiting_logout() : 로그아웃 대기 메서드 (블록)
– login_call() : 로그인 요청
– disconnect_call() : 서버 연결 끊기 요청

 

  이렇게 설계된 다이어그램을 기반으로 ThreadJob부터 구현을 시작해 보겠다.

 

 

buycycle.name

'Buycycle'은 증권사 API를 HTTP Json으로 요청 및 응답 받을 수 있습니다. 요청 받은 Json 메시지를 증권사 API 양식에 맞게 변환해 주는 자바 기반의 오픈 소스 입니다. HTTP RESTful을 제공함으로써 사용자

buycycle.name

반응형