Coding History/Team Project

팀플) REST API 일몰 일출 정보 데이터

BlackBirdIT 2024. 10. 10. 13:18

일단 구현중 큰 문제에 직면함..

datetime이라는 파이썬에서 기본으로 제공하는 라이브러리가 있는데, timedelta를 엑세스 할 수 없는 문제에 직면했다.

venv(가상환경)을 지웠다가 다시 생성하고 라이브러리를 받아도 해결이 되지 않았다.

구글링 해보니까 datetime.py를 생성해서 사용한다면 이런 문제가 발생할 수도 있다고 하는데, 나의 경우는 당연 그건아니고 datetime임포트까진 되는데 timedelta를 불러오는데서 문제가 발생한 것.

재설치 해보고 파이썬 콘솔로 사용해봤는데 사용은 된다. 근데 어째선지 프로젝트에서는 안된다.

어 너무 답답해서 그냥 여기서 찾아봤는데 두개네?

아 두개가 문제가 아니고 가상환경에서 pip내에 datetime.py가 존재하는데 이것 때문에 충돌하는건가?

아니 얘네 제정신인가 이런 버그가 있다는걸 아는데 pip내에 datetime.py를 생성해 놓는다고???

아무튼 뭐가 문젠지 알았다. 이거 지워버리고 싶은 마음은 굴뚝같은데 또 이상한 문제 생겨서 또 지우고 다시 만들긴 싫으니까 다른 방법을 찾아보자.


일단 프로젝트를 inteliJ로 옮겨봤다. 옮겨서 확인하니까 잘 된다.

진짜 왜그러냐 나한테...

아무튼 문제 해결 했고 일어나면 학원 가야되는데 지금 4시 40분이다 ㅋㅋ


그래서 일단 만들어 놓은 로직을 검증하려고 하는데

이런 버그가 계속 떴다.

파이썬의 리소스 트래커가 프로세스 종료 시 관리되지 않은 세마포어 객체가 존재한다는 경고를 보여주는거라는데..

일단 문제가 뭐냐 하면 리소스 누수 때문이다.

이를 해결하려고 SKyfield를 닫아주는 코드도 추가했지만 해결이 되지 않았다.

리소스 추적기 관련 경고 무시하는 코드를 넣어도 해결 안됨.

다른 여러가지 방법들도 사용해봤는데 전혀 먹히지 않아서, 다른 방법들을 찾다가 SKyfield를 전역으로 관리하는 방법도 있어서 일단 이렇게 해보도록 하겠다.

# global_resources.py
# skyfield 전역변수로 사용

from skyfield.api import load


# 타임스케일 및 행성 데이터 로드 (전역 로드)
ts = load.timescale()
planets = load('de421.bsp')

이렇게 global_resources.py를 app에 생성해주고,

skyfield.api를 호출하는 곳들에 모두

from app.global_resources import ts, planets  # 전역 리소스 임포트

이렇게 선언해주었다.

그리고 run.py

# 종료 시 planets 리소스 해제
atexit.register(planets.close)

해당 코드 추가해서 닫아주는 것으로 끝.

근데 안되네? 아 진짜 욕하고 싶다.

할 수 있는건 다 해봤는데 안되는거라, 이게 코드 문제가 더이상은 아닌 것 같다.

그래서 도커 설치진행.

도커 다 설치 했고,

기타 등등 설정도 했다.

도커 콘솔에서 접속 결과

반환한다!!!!! 근데 크롬에서는 접속 자체가 안되서 이 부분 해결해야될듯 그래도 일단 도커에서는 메모리 누수가 없다는 것을 알았다.

아 도커로 바뀌어서

url을 localhost로 바꿔서 써주니까 되네.

됐다.....

일몰 일출 데이터 로직 일단 완성 보완점은 나중에 생각하자.

일단 문제가 발생한 원인이 정확하지는 않지만 NumPy 라이브러리에서 C 확장 모듈을 사용해서 성능을 높이는데, 이때 시스템 자원을 직접 관리하기 때문에 Python의 자동 메모리 관리에 맞추지 못할 때가 있다고 한다. 아마 이게 제일 근접한 이유가 아닐까 싶다.

그럼 왜 해결이 됐는가?

Docker는 이러한 리소스를 명확하게 관리할 수 있도록 격리된 환경을 제공하고, Python의 자동 메모리 관리가 부족한 부분을 보완해 줌으로써 문제가 해결될 수 있었다고 본다.


그럼 정보로써의 가치는 있는가?

대략적인 정보로 충분할 것 같긴한데 시간과 지역을 조금 더 신경써서 다듬으면 좋을 것 같다. 이건 지금 바로 해놓자.

라고 생각했는데 이렇게 하려면 API 연결이 필요하네;; 다음 포스팅으로 넘어가자.