Log/Today

threading 왜 되는 걸까? PumpMessages가 뭐길래?

daco2020 2022. 1. 13. 18:25
반응형

목표 

  • 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()을 사용하는 것이 좋다고 생각한다.

반응형