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 [email protected].
To post to this group, send email to [email protected].
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.