프로그래밍/파이썬
[파이썬] 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을 구현해보도록 하겠다.
반응형