@Satoh_D no blog

大分にUターンしたので記念に。調べたこととか作ったこととか食べたこととか

Django と Channelsでチャット作成のチュートリアルをやってみる(Tutorial Part 3: Rewrite Chat Server as Asynchronous)

前々回前回の続き

今回は前章までで作成したチャットサーバを非同期処理で書き直す
非同期処理にするとリクエストごとにスレッドが追加されないから同期処理に比べてパフォーマンスが高いとのこと

前章までで作成したChatConsumerを非同期で書き直すと以下の通り

# chat/consumers.py
import json
from channels.generic.websocket import AsyncWebsocketConsumer

class ChatConsumer(AsyncWebsocketConsumer):
    # 接続時処理
    async def connect(self):
        # チャンネル名とグループ名を定義
        self.room_name = self.scope['url_route']['kwargs']['room_name']
        self.room_group_name = 'chat_%s' % self.room_name

        # Join room group
        await self.channel_layer.group_add(
            self.room_group_name,
            self.channel_name
        )

        await self.accept()

    # 切断時処理
    async def disconnect(self, close_code):
        # Leave room group
        await self.channel_layer.group_discard(
            self.room_group_name,
            self.channel_name
        )

    # メッセージ受信時処理
    async def receive(self, text_data):
        text_data_json = json.loads(text_data)
        message = text_data_json['message']

        # Send message to room group
        await self.channel_layer.group_send(
            self.room_group_name,
            {
                'type': 'chat_message',
                'message': message
            }
        )
    
    # メッセージの受信→送信
    async def chat_message(self, event):
        message = event['message']

        # Send message to WebSocket
        await self.send(text_data=json.dumps({
            'message': message
        }))

非同期処理に書き換えた場合に変わる点は以下の通り

  • WebsocketConsumerではなくAsyncWebsocketConsumerを継承する
  • 全てのメソッドがdefではなくasync defに変更となる
  • I/Oが発生する処理は全てawaitを付与する
  • async_to_syncを利用しなくなる

参考サイト