Trying to call a consumer method inside a SyncConsumer class
def alert_receive(self, event): # Get a message of the
alert.receive type off of channel_layers
content = json.dumps("Group send working")
self.send({
"type":"websocket.send", # then send a message
out on websocket protocol to whatever the 'self' channel is.
"text":content,
})
from a python script *outside of this consumer class* using the approach
from the docs:
from asgiref.sync import async_to_sync
from channels.layers import get_channel_layer
channel_layer = get_channel_layer()
async_to_sync(channel_layer.group_send)("AlertReceivers", {"type":
"alert.receive"})
The last line there raises this traceback:
Traceback (most recent call last):
File "/usr/lib/python3.5/code.py", line 91, in runcode
exec(code, self.locals)
File "<console>", line 1, in <module>
File "/usr/local/lib/python3.5/dist-packages/asgiref/sync.py", line 49,
in __call__
return call_result.result()
File "/usr/lib/python3.5/concurrent/futures/_base.py", line 398, in result
return self.__get_result()
File "/usr/lib/python3.5/concurrent/futures/_base.py", line 357, in
__get_result
raise self._exception
File "/usr/local/lib/python3.5/dist-packages/asgiref/sync.py", line 63,
in main_wrap
result = await self.awaitable(*args, **kwargs)
File "/usr/local/lib/python3.5/dist-packages/channels_redis/core.py",
line 313, in group_send
pool = await self.connection(self.consistent_hash(group))
File "/usr/local/lib/python3.5/dist-packages/channels_redis/core.py",
line 377, in connection
self.pools[index] = await
aioredis.create_redis_pool(**self.hosts[index])
File
"/usr/local/lib/python3.5/dist-packages/aioredis/commands/__init__.py",
line 197, in create_redis_pool
loop=loop)
File "/usr/local/lib/python3.5/dist-packages/aioredis/pool.py", line 59,
in create_pool
await pool.wait_closed()
File "/usr/local/lib/python3.5/dist-packages/aioredis/pool.py", line 177,
in wait_closed
await asyncio.shield(self._close_waiter, loop=self._loop)
File "/usr/lib/python3.5/asyncio/futures.py", line 361, in __iter__
yield self # This tells Task to wait for completion.
RuntimeError: Task <Task pending coro=<AsyncToSync.main_wrap() running at
/usr/local/lib/python3.5/dist-packages/asgiref/sync.py:63>
cb=[_run_until_complete_cb() at
/usr/lib/python3.5/asyncio/base_events.py:164]> got Future <Future pending>
attached to a different loop
Note that if I do a
async_to_sync(self.channel_layer.group_send)("AlertReceivers", {"type":
"alert.receive"})
from *within *the consumer class, it works well and getting that
alert.receive type event onto the channel_layer and sending the JSON
encoded "Group send working" message out to all member channels of the
group, just like it should do from outside the consumer.
--
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/19d95ebf-99a3-4f9a-a020-47b8803a6cdb%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.