-
[파이썬] eBest Xing api 실시간조회, ThreadJob 구현 (3)프로그래밍/파이썬 2020. 2. 22. 15:29반응형
[파이썬] 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)
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을 구현해보도록 하겠다.
반응형'프로그래밍 > 파이썬' 카테고리의 다른 글
[파이썬] eBest Xing api 실시간조회, NWS 뉴스 요청 구현 (6) (0) 2020.02.22 [파이썬] eBest Xing api 실시간조회, QueryThreadJob 구현 (5) (2) 2020.02.22 [파이썬] eBest Xing api 실시간조회, ConnectionManager 구현 (4) (0) 2020.02.22 [파이썬] eBest Xing api 실시간조회, 스레드 설계 구현 (2) (0) 2020.02.22 [파이썬] eBest Xing api 실시간조회, 멀티스레드 설계 (1) (4) 2020.02.22