Notice
Recent Posts
Recent Comments
Link
코드로 우주평화
threading 왜 되는 걸까? PumpMessages가 뭐길래? 본문
반응형
목표
- flask-app 실행 후 Cybos-Subscribe 시작, event 수신 데이터 받아 DB에 저장하기
문제
- 성공한 줄 알았던 threading이 다시 보니 정상적으로 작동하지 않음
- 스레드는 나눠진 것 같으나 cybos api의 정보를 정상적으로 받아오지 못하는 상황
- cybos api 오류가 뜨거나 flask context app 오류가 뜨거나, 정확한 원인도 파악하지 못하는 상황
행동
- 일단 리더님께 말씀드리고 피드백에 따라 flask와 분리하여 작게 테스트를 해보기 시작
- cybos api 오류의 경우 pythoncom.CoInitialize()로 어떻게든 잡음
- 서브 스레드의 경우 cybos 인스턴스를 초기화해야하기 때문? >>> 레퍼런스
- 기존 PumpWaitingMessages 코드를 PumpMessages로 대체함
- PumpWaitingMessages : 현재 스레드에 대한 모든 대기 메시지를 펌핑합
- PumpMessages : WM_QUIT 메시지까지 현재 스레드에 대한 모든 메시지를 펌핑
- 왜 PumpWaitingMessages는 안되고 PumpMessages는 되는가?
- 솔직히 기능적으로 어떤 차이가 있는지 이해하기 어려움
결과
- PumpMessages로 대체하고 나서 cybos api로부터 데이터를 받아올 수 있게 됨
- 하지만 정상적인지는 모르겠음. 왜냐하면 서버가 실행되고 요청을 보내면 바로 값을 확인할 수 없고 터미널에서 컨트롤 C로 한번 나가야 데이터를 받아오는 걸 확인할 수 있음. 마치 눈에 보이지 않아도 백그라운드에서 실행되고 있는 느낌?
- 물론 그 이후에도 서버 요청은 정상적으로 작동함. 이것이 스레드가 나눠졌기 때문에 생기는 현상인걸까?
- DB에는 처음부터 들어가는 것 확인함
앞으로
- 현재 작성한 코드를 더 재활용하기 쉽게 리펙토링 하고 싶다.
- subscribe 이벤트 수신 값을 flask 서버와 별개로 받아와보고 싶다.
- cybos의 여러 인스턴스가 문제없이 실행되는 팩토리 패턴을 적용해보고 싶다.
- threading의 개념을 더 잘 이해하고 프로젝트에 적용해보고 싶다.
- 서버로 요청할 때마다 스레드가 추가되는 것을 볼 수 있었는데 왜 스레드는 재활용되지 않고 추가되는 것일까?
- threading을 이용해 여러 종류의 실시간 데이터를 동시에 받아오고 싶다.
새롭게 알게 된 것
1. 일반 함수로 실행하는 것과 스레드 함수로 실행하는 것의 차이는 무엇인가?
# 일반 함수 실행
function(parameter)
# 스레드 함수 실행
thread = threading.Thread(target=function, args=(parameter,))
thread.start()
포스트맨으로 서버에 요청을 보내보니 그 차이를 알 수 있었다.
일반 함수 실행도 이벤트 메시지를 수신받지만 응답을 계속해서 기다리는 대기상태이다.
스레드 함수 실행은 서버로부터 즉시 응답을 받고 이벤트 메시지를 지속적으로 수신한다.
즉, 실제 클라이언트가 최초 요청 후 다른 액션을 할 수 있으려면 스레드 함수로 실행을 해야한다.
2. 스레드 이름을 확인하는 'name'과 'getName()'의 차이는 무엇인가?
# name -> 현재 스레드의 속성(속성을 바꾸면 이름도 바뀜)
name = threading.currentThread().name
# getName() -> 현재 스레드의 매서드
name = threading.currentThread().getName()
우선 이 둘은 결과 값이 동일하다.
이 둘의 차이는 getName()은 스레드의 '매서드', name은 스레드의 '속성'이라는 점이다.
때문에 name속성을 변경하면 값이 바뀔 수 있고 getName()의 값과 달라질 수 있다.
결론적으로 정확한 스레드의 이름을 노출하고 싶다면 되도록 getName()을 사용하는 것이 좋다고 생각한다.
반응형
'Log > Today' 카테고리의 다른 글
apscheduler를 활용한 예약 실행 성공 (0) | 2022.01.18 |
---|---|
메모리, csv, DB입력, 그리고 데이터 반환 (0) | 2022.01.17 |
파일 시스템으로 DB 인서트 하는 중 (0) | 2022.01.14 |
threading 으로 python병렬처리 성공 (0) | 2022.01.12 |
Flask로 Subscribe데이터 받기 실패 (0) | 2022.01.10 |