Consumer하는 일 중 몇가지:
- 이벤트가 발생했을 때 사용할 함수를 작성하기만 하면 된다. event loop전체를 다 쓸 필요가 없다.
- synchronous / asynchronous 코드를 작성하기만 하면 threading을 포함한 나머지를 다 처리해준다.
Consumer Events
from channels.consumer import SyncConsumer class EchoConsumer(SyncConsumer): def websocket_connect(self, event): self.send({ "type": "websocket.accept", }) def websocket_receive(self, event): self.send({ "type": "websocket.send", "text": event["text"], })
Consumer는 type과 매칭되는 몇가지의 메소드들로 구성되어 있다. type에서 .를 _로 바꾼것이 메소드 이름이다. 즉 위의 예시에서
"type": "websocket.accpet" 는 websocket_accept()를 호출하고
"type": "websocket.send"는 websocket_send()를 호출한다.
그렇다면 위의 예시에서 websocket_receive(self, event)는 event["text"]를 접근하고 있는데 websocket_receive의 event안에 text가 있다는 것은 어떻게 알았을까? 이는 ASGI에서 정해진 규약을 따른다.
AsyncConsumer vs SyncConsumer
AsyncConsumer와 SyncConsumer의 사용처에 대해서는 쉽게 정리하자면 asynchronous 코드들만 실행될 경우에는 AsyncConsumer를, ORM처럼 Synchronous 코드는 SyncConsumer에서 호출하도록 한다.
Closing Consumers
Socket이나 Connection이 끊기면 보통은 서버에 event(http.disconnect or websocket.disconnect)가 보내진다. disconnect에 관련된 작업을 마치면 channels.exceptions.StopConsumer를 발생시켜 ASGI application을 정상적으로 중지시켜야된다. 따로 중지시키지 않는다면, server는 timeout시간이 되면 자동종료시키고 warning을 띄운다.
Channel Layers
from channels.consumer import SyncConsumer class EchoConsumer(SyncConsumer): channel_layer_alias = "echo_alias"
위의 코드처럼 channel_layer_alias를 별도로 명시해주지 않는다면 Consumer는 default channel layer를 사용한다.
'백엔드' 카테고리의 다른 글
[Django REST Framework] create() vs perform_create() (0) | 2020.03.18 |
---|---|
Django Channels - Introduction (0) | 2020.03.18 |
[PostgreSQL 공부하기] PostgreSQL Index는 B-Tree를 어떻게 사용할까? (1) | 2019.12.23 |
[PostgreSQL 공부하기] Index는 어떤 column에 생성해야될까? (0) | 2019.12.17 |
[PostgreSQL 공부하기] Index의 종류 (0) | 2019.12.17 |