06. WebSocket Consumer の処理の非同期処理化
パフォーマンスを向上させるために、WebSocket Consumerの処理を、同期ではなく非同期の処理に書き換えます。
解説
Channelsパッケージには、非同期処理に対応したWebSocket Consumerクラスが用意されています。非同期処理に対応したWebSocket
Consumerクラスを利用すると、非同期処理を簡単に実現できます。
WebSocket Consumerの処理を、同期処理から非同期処理に変更するために、すべきことは以下です。
- WebSocket Consumerの実装クラスであるChatConsumerクラスの親クラスを「WebsocketConsumer」から「AsyncWebsocketConsumer」に変更します。
- ChatConsumerクラスのメンバ関数定義の「def」を「async def」に変更します。
- ChatConsumerクラスの非同期関数の呼び出しに、「await」を追記します。
- ChatConsumerクラスの「async_to_sync」は、削除します。
準備
05. を実施していない場合は、まず、05. を実施します。
仮想環境への切り替え
仮想環境に切り替えていない場合は、「MyChat」フォルダにて、下記コマンドを実行し、仮想環境に切り替えます。
「mysite」フォルダに移動していない場合は移動します。
これ以降のコマンドの実行は、仮想環境にて実行します。
WebSocket Consumerの処理を非同期処理に変更
WebSocket Consumerの処理を、同期処理から非同期処理に変更します。
「mysite/chat/consumers.py」に、以下の変更を追加します。
- WebsocketConsumerのimportを、AsyncWebsocketConsumerのimportに変更します。 ( from channels.generic.websocket import AsyncWebsocketConsumer )
- async_to_syncクラスのimport文をコメントアウトします。
- ChatConsumerクラスの親クラスを「WebsocketConsumer」から「AsyncWebsocketConsumer」に変更します。
- ChatConsumerクラスのメンバ関数定義の「def」を「async def」に変更します。
- ChatConsumerクラスの非同期関数の呼び出しに、「await」を追記します。
- ChatConsumerクラスの「async_to_sync」で囲んだ記述は削除します。
「mysite/chat/consumers.py」の内容を、以下のようにします。
動作確認
動作に関しては、前項と本項は変わりません。
「mysite」フォルダにて、下記コマンドを実行し、サーバーを起動します。
ブラウザを1つ立ち上げ、「http://127.0.0.1:8000」にアクセスします。
「aiueo」と「あいうえお」というメッセージをフォームに入力し、「Send」ボタンを押します。
送信したメッセージが、即座に、ブラウザのメッセージリストに追加されます。
ブラウザをもう1つ立ち上げ、「http://127.0.0.1:8000」にアクセスします。
「abc」と「xyz」というメッセージをフォームに入力し、「Send」ボタンを押します。
送信したメッセージが、即座に、両方のブラウザのメッセージリストに追加されます。
起動したサーバーは、「Ctrl + C」で終了します。
ダウンロード
関連ページ
前項目:05. チャットメッセージの送受信
次項目:07. メッセージに発言者名の追記