페이지 GET요청을 확인 중 지도페이지에 두번 이상 접속 하면 페이지 로딩시간이 굉장히 길어지고, websocket의 지도좌표값이 갱신되지 않는 현상 발견.
처음에는 단순히 컴퓨터의 렉때문에 느린것이라고 판단하고 내버려 두었지만, 생각보다 과하게 페이지 로딩이 되지 않아 의문을 가지고 지도 요청 시 websocket동작에 대해 한번 더 살펴보기로 함.
한이음 콜드론 프로젝트를 진행중 websocket을 통하여 http://127.0.0.1:8000/app1/page3 접속 시 실시간 지도 좌표정보를 보내 주었다.
브라우저로 실시간 좌표값을 보내주는 django의 파이썬 코드는 다음과 같다.
# 장고 서버 실행시 WSConsumer class가 생성된다.
class WSConsumer(AsyncWebsocketConsumer):
print("WSConsumer class생성완료")
# 외부 드론으로부터 들어오는 위치정보 데이터를 담고있는 Queue자료구조
data_from_drone = deque([])
# 클라이언트 단에서 웹소켓 연결요청을 하면 connect함수가 실행 된다
# 연결이 끊어지면 connect함수는 종료 된다
async def connect(self):
print('connect함수 실행')
await self.accept()
# 사용자가 새로 지도페이지에 접속했기 때문에
# data_from_drone 내부값을 비워주고 새로 갱신한다.
print('위치정보갱신')
self.data_from_drone.clear()
while True:
if 'stop' in self.data_from_drone:
self.data_from_drone.clear()
break
if self.data_from_drone:
await self.send(json.dumps({'message' : self.data_from_drone.popleft()}))
await sleep(2)
page3(지도페이지)에 접속 하면 connect()함수가 실행되며 while문을 통하여 정보를 전달하게 된다.
이때 page3를 탈출해도(즉, page1, page2, page4로 GET요청을 할 때) while을 빠져나오지 못해 계속해서 켜져있는 버그가 발생하였다.
생각보다 단순간 버그였지만, 실제 웹페이지의 동작을 확인할 때 지도페이지에서 과하게 긴 로딩시간이 걸려 당황하였고 쉽게 원인을 발견하지 못하였다.
해결법은 connect함수 내부의 공유변수(deque)값에 GET요청이 들어올 때마다 'stop'이라는 값을 넣어주어 connect함수의 while문을 조건문을 이용하여 빠져나오도록 하였다.
<버그발생>
###현재 page1은 get요청이 잘 들어가지 않는데 나중에 반드시 이유를 찾아야함###
'프로젝트 > 한이음' 카테고리의 다른 글
[한이음]Django서버로부터 실시간데이터 수신 (0) | 2022.09.27 |
---|---|
[한이음] 드론(JetsonNano)으로부터 실시간 데이터 수신 (0) | 2022.09.26 |
[한이음] Django 서버 시작시 2개 프로세스 생성 (0) | 2022.09.26 |
[한이음-콜드론] 프로젝트 디렉토리구조 (0) | 2022.07.10 |
[한이음-콜드론] 개발 메뉴얼 (0) | 2022.06.04 |