Django聊天室(三)将聊天室改写为异步

 2018年5月8日 15:21   Nick王   开发    0 评论   315 浏览 

Django 版本:1.11.13
Django-Channels 版本:2.1.1
Python 版本:3.6.5

Django聊天室(三)将聊天室改写为异步

在本章中,我们会把之前的消费者的代码改写为异步,以提高性能。

将消费者改写为异步

到目前为止,我们的ChatConsumer还是同步的。同步的消费者非常的方便,因为他们可以调用常规的同步的I/O操作,比如无需编写特殊代码的访问Django模型。但是,异步使用者可以提供更高级别的性能,因为他们在处理请求时不需要创建额外的线程。

ChatConsumer仅使用async-native库(Channels和channel layer),特别是它不访问同步Django模型。因此,它可以被重写为异步并发。

重新编写代码chat/consumers.py:

from channels.generic.websocket import AsyncWebsocketConsumer
import json


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
        )

    # Receive message from WebSocket
    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
            }
        )

    # Receive message from room group
    async def chat_message(self, event):
        message = event['message']

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

这个ChatConsumer新代码和旧代码非常的相似,但是有以下几点区别:

  • ChatConsumer现在是从AsyncWebsocketConsumer继承,而不是WebsocketConsumer

  • 所有的方法都是async def而不仅仅是def

  • await用于调用执行I/O的异步函数

  • 调用channel layer的方法时,不再需要async_to_sync

现在,你的聊天室服务器是异步的了。



如无特殊说明,文章均为本站原创,转载请注明出处