Open
Description
It seems that groups
slow down sending messages ~100 times:
I've created 3 different echo consumers in order to compare them:
- AsyncJsonWebsocketConsumer with groups
- AsyncConsumer with groups
- AsyncConsumer without groups
I got these timing results:
1.
Elapsed time 0.026857614517211914.
Elapsed time 0.026637554168701172.
Elapsed time 0.03318667411804199.
Elapsed time 0.03062891960144043.
Elapsed time 0.026413679122924805.
Elapsed time 0.028857707977294922.
Elapsed time 0.03323197364807129.
Elapsed time 0.026538610458374023.
Elapsed time 0.036324501037597656.
Elapsed time 0.0322566032409668.
Elapsed time 0.0385587215423584.
Elapsed time 0.02066636085510254.
Elapsed time 0.03473186492919922.
Elapsed time 0.03095531463623047.
Elapsed time 0.022891759872436523.
2.
Elapsed time 0.02672290802001953.
Elapsed time 0.022529125213623047.
Elapsed time 0.042157888412475586.
Elapsed time 0.028131961822509766.
Elapsed time 0.035176753997802734.
Elapsed time 0.03284716606140137.
Elapsed time 0.03023362159729004.
Elapsed time 0.03440999984741211.
Elapsed time 0.029916763305664062.
Elapsed time 0.03461766242980957.
3.
Elapsed time 0.00019168853759765625.
Elapsed time 9.107589721679688e-05.
Elapsed time 0.00020265579223632812.
Elapsed time 0.0004429817199707031.
Elapsed time 0.0002741813659667969.
Elapsed time 0.00019693374633789062.
Elapsed time 0.00026679039001464844.
Elapsed time 0.0003097057342529297.
Elapsed time 0.00017261505126953125.
Elapsed time 0.0003085136413574219.
Elapsed time 0.00048232078552246094.
Elapsed time 0.0002384185791015625.
Here is the consumers code:
from channels.generic.websocket import AsyncJsonWebsocketConsumer, AsyncConsumer
from time import time
from channels.layers import get_channel_layer
from asgiref.sync import async_to_sync, sync_to_async
class EchoConsumer1(AsyncJsonWebsocketConsumer):
async def connect(self):
await self.accept()
await self.channel_layer.group_add("test", self.channel_name)
async def disconnect(self, close_code):
await self.channel_layer.group_discard("test", self.channel_name)
async def receive_json(self, content):
start = time()
await self.channel_layer.group_send(
"test",
{
"type": "chat.message",
"json": content
}
)
print("Elapsed time {}.".format(time()-start))
async def chat_message(self, event):
await self.send_json(event["json"])
class EchoConsumer2(AsyncConsumer):
async def websocket_connect(self, event):
await self.send({
"type": "websocket.accept",
})
await self.channel_layer.group_add("test", self.channel_name)
async def websocket_send(self, event):
await self.send(event)
async def websocket_receive(self, event):
start = time()
channel_layer = get_channel_layer()
await channel_layer.group_send(
"test",
{
"type": "websocket.send",
"text": event["text"],
}
)
print("Elapsed time {}.".format(time()-start))
class EchoConsumer3(AsyncConsumer):
async def websocket_connect(self, event):
await self.send({
"type": "websocket.accept",
})
async def websocket_receive(self, event):
start = time()
await self.send({
"type": "websocket.send",
"text": event["text"],
})
print("Elapsed time {}.".format(time()-start))