Hi. I'm using Django channels in server side for a speech to text 
application. When I test websocket with jmeter(+120 user or thread in 1 
second), about half of requests fail. Here is my code:

class Consumer(AsyncWebsocketConsumer):
        def __init__(self, *args, **kwargs):
                super().__init__(*args, **kwargs)
                self.session = aiohttp.ClientSession()
                # some other initialization

        async def connect(self):
                await self.accept()

        async def received(self, text_data=None, bytes_data=None):
                self.data = bytes_data
                async with self.session:
                      await self.send(bytes_data=(await 
self._fetch(self.session)).encode())

        async def _fetch(self, client):
                async with client.post(url=self.url,
                                                      headers=self.headers,
                                                      
params=self.querystrings,
                                                      data=self.data) as 
resp:
                        return await resp.text()



for 100-120 requests in 1 sec(i.e. 100-120 users in jmeter) it works well. 
But for +120 requests some of them failed. Each request sends 319523 bytes 
to websocket and then websocket sends them to an api and send back 
response. Here is the exception that raise for +120 requests:



[2019-06-11 07:20:29 +0000] [31064] [ERROR] Exception in ASGI application

Traceback (most recent call last):

File "/usr/lib/python3.5/asyncio/tasks.py", line 241, in _step

result = coro.throw(exc)

File "/usr/local/lib/python3.5/dist-packages/websockets/protocol.py", line 
674, in transfer_data

message = yield from self.read_message()

File "/usr/local/lib/python3.5/dist-packages/websockets/protocol.py", line 
742, in read_message

frame = yield from self.read_data_frame(max_size=self.max_size)

File "/usr/local/lib/python3.5/dist-packages/websockets/protocol.py", line 
815, in read_data_frame

frame = yield from self.read_frame(max_size)

File "/usr/local/lib/python3.5/dist-packages/websockets/protocol.py", line 
884, in read_frame

extensions=self.extensions,

File "/usr/local/lib/python3.5/dist-packages/websockets/framing.py", line 
99, in read

data = yield from reader(2)

File "/usr/lib/python3.5/asyncio/streams.py", line 669, in readexactly

yield from self._wait_for_data('readexactly')

File "/usr/lib/python3.5/asyncio/streams.py", line 459, in _wait_for_data

yield from self._waiter

File "/usr/lib/python3.5/asyncio/futures.py", line 380, in __iter__

yield self # This tells Task to wait for completion.

File "/usr/lib/python3.5/asyncio/tasks.py", line 304, in _wakeup

future.result()

File "/usr/lib/python3.5/asyncio/futures.py", line 285, in result

raise CancelledError

concurrent.futures._base.CancelledError


The above exception was the direct cause of the following exception:


Traceback (most recent call last):

File 
"/usr/local/lib/python3.5/dist-packages/uvicorn/protocols/websockets/websockets_impl.py",
 
line 146, in run_asgi

result = await self.app(self.scope, self.asgi_receive, self.asgi_send)

File "/usr/local/lib/python3.5/dist-packages/uvicorn/middleware/asgi2.py", 
line 7, in __call__

await instance(receive, send)

File "/usr/local/lib/python3.5/dist-packages/channels/sessions.py", line 
183, in __call__

return await self.inner(receive, self.send)

File "/usr/local/lib/python3.5/dist-packages/channels/middleware.py", line 
41, in coroutine_call

await inner_instance(receive, send)

File "/usr/local/lib/python3.5/dist-packages/channels/consumer.py", line 
59, in __call__

[receive, self.channel_receive], self.dispatch

File "/usr/local/lib/python3.5/dist-packages/channels/utils.py", line 52, 
in await_many_dispatch

await dispatch(result)

File "/usr/local/lib/python3.5/dist-packages/channels/consumer.py", line 
73, in dispatch

await handler(message)

File 
"/usr/local/lib/python3.5/dist-packages/channels/generic/websocket.py", 
line 198, in websocket_receive

await self.receive(bytes_data=message["bytes"])

File "/home/nima/stt/stt_project/stt_app/consumer.py", line 257, in receive

await self.send(bytes_data=(await self._fetch(self.session)).encode())

File 
"/usr/local/lib/python3.5/dist-packages/channels/generic/websocket.py", 
line 213, in send

await super().send({"type": "websocket.send", "bytes": bytes_data})

File "/usr/local/lib/python3.5/dist-packages/channels/consumer.py", line 
81, in send

await self.base_send(message)

File "/usr/local/lib/python3.5/dist-packages/channels/sessions.py", line 
236, in send

return await self.real_send(message)

File 
"/usr/local/lib/python3.5/dist-packages/uvicorn/protocols/websockets/websockets_impl.py",
 
line 204, in asgi_send

await self.send(data)

File "/usr/local/lib/python3.5/dist-packages/websockets/protocol.py", line 
462, in send

yield from self.ensure_open()

File "/usr/local/lib/python3.5/dist-packages/websockets/protocol.py", line 
646, in ensure_open

) from self.transfer_data_exc

websockets.exceptions.ConnectionClosed: WebSocket connection is closed: 
code = 1006 (connection closed abnormally [internal]), no reason

I run asgi application with uvicorn

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-users+unsubscr...@googlegroups.com.
To post to this group, send email to django-users@googlegroups.com.
Visit this group at https://groups.google.com/group/django-users.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/e9b8ec7a-b9cd-41e8-8d8f-18e5c93f0441%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to