프로그래밍/파이썬

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

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

 

 

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)

 

 

buycycle.name

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

buycycle.name

 

  2번째 글에서 언급했던 클래스 다이어그램을 기반으로 중추적 역할인 ThreadJob을 구현한 소스는 다음과 같다.

import threading
import queue
import pythoncom
 
from name_yalsooni.crawler_py.ebest.util import Log
from abc import *
 
 
# 병행처리기 - 추상화
class ThreadJob(threading.Thread):
    __metaclass__ = ABCMeta
 
    CM_COMMAND = "COMMAND"
    CM_SHUTDOWN = "SHUTDOWN"
 
    # 초기화
    @abstractmethod
    def _init(self):
        pass
 
    # 실행
    @abstractmethod
    def _execute(self, command):
        pass
 
    # 셧다운
    @abstractmethod
    def _shutdown(self):
        pass
 
    # 생성자
    def __init__(self, thread_name, command_queue_timeout):
        threading.Thread.__init__(self, name=thread_name)
        self.running = True
        self.commandQueue = queue.Queue()
        self.command_queue_timeout = command_queue_timeout
 
    # Thread start..
    def run(self):
        pythoncom.CoInitialize()
        self._init()
        self._waiting_queue()
 
    # 셧다운 명령어 요청
    def shutdown_call(self):
        self._push_command(self.CM_SHUTDOWN)
 
    # 명령어 대기
    def _waiting_queue(self):
        while self.running:
            try:
                command = self.commandQueue.get(True, self.command_queue_timeout)
            except queue.Empty as em:
                pythoncom.PumpWaitingMessages()
                continue
 
            Log.write("Request Command : " + command[self.CM_COMMAND])
            if command[self.CM_COMMAND] == self.CM_SHUTDOWN:
                self._shutdown()
                pythoncom.CoUninitialize()
            else:
                try:
                    self._execute(command)
                except Exception as ex:
                    Log.write("*EXCEPTION* EXECUTE COMMAND : " + str(ex))
 
    # 명령어를 큐에 삽입
    def _push_command(self, command):
        self.commandQueue.put(command)

  위의 소스코드 중 주요 부분만 살펴보겠다.

 

- 32 Line 
  객체생성시 큐객체를 생성한다. 이 큐는 명령어를 보관하는데 사용한다.
- 39 Line : Thread.run 메소드
  새로운 스레드 생성시 pythoncom.CoInitialize() 메소드를 필수로 호출해야한다.
  _init 메소드는 상속받는 자식 클래스에게 구현을 위임한다. 
  해당 메소드를 호출 후 _waiting_queue 메소드를 호출함으로 명령어 대기에 들어간다.
- 52 Line 
  queue객체에서 get메소드를 사용하여 명령어를 획득한다. 
  이 메소드는 블록이 가능하며, 지정된 타임아웃만큼 명령어를 대기한다. 
  이 메소드에 타임아웃을 걸지 않을 경우 응답 이벤트의 수행시간이 없어 행에 걸리게 된다.
- 58 Line 
  command는 딕셔너리 객체이다. 상수로 선언된 CM_COMMAND에 의해 해당 명령어를 수행한다.
  SHUTDOWN은 공통 명령어임으로 _shutdown 메소드가 호출되게 미리 정의하였다.
  그외의 명령어는 상속받아 _execute 메소드를 구현하게 될 하위클래스에게 전달한다.
  클래스다이어그램을 보면 ThreadJob을 상속받는 클래스는 QueryThreadJob, ConnectionManager가 있다.
  두 클래스의 _execute 구현로직은 다르다.
- 68 Line : _push_command 메소드
  해당 메소드는 queue에 해당 명령어(딕셔너리)을 put 해주는 역할을 한다.
  이 메소드를 사용하는 메소드는 45줄 처럼 정의된 명령어를 넣어준다.

 

  다음으로 ThreadJob을 상속받아 구현하는 ConnectionManager, QueryThreadJob을 구현해보도록 하겠다.

 

 

buycycle.name

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

buycycle.name

반응형