지난 번에 WebSocket이 데이터를 놓치는 경우가 발생하여, max_queue의 사이즈를 조절함으로써 누락되는 데이터가 없게 설정을 했다.
하지만 이렇게 했을 때, 결국 메모리 자원을 많이 소모하고 데이터의 처리 속도에 있어서는 크게 달라지지 않았다. 그래서 다른 방법을 고안했다.
파이썬에서 asyncio를 이용하여 task를 생성할 때, task는 여러개의 코루틴으로 묶이게 된다. 기존에는 웹소켓에서 데이터를 수신하고, 처리하는 로직이 하나의 코루틴으로 형성이 되어 있었다.
파이썬의 asyncio의 동작원리는 Task안의 코루틴을 스레드가 context switching을 하면서 실행한다. 이때 스레드는 코루틴별로 context switching
을 진행하기 때문에 같은 코루틴 내에서 비동기 함수로 설정을 했다고 하더라도 결국 동기적으로 동작하는 문제가 발생한다. 그래서 WebSocket에서 데이터를 받고 처리하는 과정에서 결국 놓치는 데이터가 발생했던 것이다.
이를 다른 방법으로 해결하고자 시도했다.
async for ws in websockets.connect():
while True:
await self.trade_record_queue.put(await asyncio.wait_for(ws.recv(), timeout=10))
위와 같은 방법으로 웹소켓을 수신받을 때, queue에 넣어주는 코루틴을 생성하고 데이터를 처리하는 로직을 따로 다른 코루틴으로 분리하여 비동기적으로 동작할 수 있게 설정을 해줌으로써, 웹소켓의 max_queue사이즈를 조정하지 않고도 누락되는 데이터 없이 처리가 가능해졌다.