【问题标题】:django channels - delayed messaging does not workdjango 频道 - 延迟消息不起作用
【发布时间】:2020-03-09 00:59:05
【问题描述】:

我试图通过延迟 Django 频道中的组消息来模仿耗时的 django 响应,但它不起作用。

消费者很简单:

class ExportConsumer(JsonWebsocketConsumer):
    ...

    def delayed_message(self, event):
        print("In delayed")
        time.sleep(5)
        self.send(text_data=json.dumps({
            'message': 'delayed!'
        }))
    def immediate_message(self, event):
        print("In Immediate")
        self.send(text_data=json.dumps({
            'message': 'immediate_message!'
        }))

在视图中,我只是向一个组发送两条消息 - 用于延迟和立即处理:


class DecisionListView(PaginatedListView):
    ...

    def get(self, *args, **kwargs):
            async_to_sync(get_channel_layer().group_send)(
                '5e001793-18be-4a4b-8caf-c4a8144a11d2',
                {
                    'type': 'immediate_message',
                    'message': 'message'
                }
            )
            async_to_sync(get_channel_layer().group_send)(
                '5e001793-18be-4a4b-8caf-c4a8144a11d2',
                {
                    'type': 'delayed_message',
                    'message': 'message'
                }
            )
        return super().get(*args, **kwargs)

“即时消息”已传递。我在终端上得到In delayed(这意味着它到达delayed_message,但消息永远不会传递(除非我注释掉time.sleep。

我做错了什么?

更新:: AsyncJsonWebsocketConsumer 也不行:

consumers.py:

class ExportConsumer(AsyncJsonWebsocketConsumer):
    ...

    async def delayed_message(self, event):
        await asyncio.sleep(5)
        await self.send(text_data=json.dumps({
            'message': 'whatever'
        }))

views.py:


class DecisionListView(PaginatedListView):
    ...
    def get(self, *args, **kwargs):
        _group_send = get_channel_layer().group_send
        _sync_group_send = async_to_sync(_group_send)
        _sync_group_send('5e001793-18be-4a4b-8caf-c4a8144a11d2',{"type":'delayed_message', 'message':'hello'})
        return super().get(*args, **kwargs)

更新2:

唯一对我有用的是asyncio.create_task:




class ExportConsumer(AsyncJsonWebsocketConsumer):
    async def delayed_task(self):
        await asyncio.sleep(5)
        await self.channel_layer.group_send(
            self.room_group_name,
            {
                'type': 'chat_message',
                'message': 'LATER'
            }
        )

    async def delayed_message(self, event):
        asyncio.create_task(self.delayed_task())
        await self.send_json('NOW')

    async def chat_message(self, event):
        message = event['message']
        await self.send_json(message)

【问题讨论】:

标签: django django-channels


【解决方案1】:

您应该使用AsyncJsonWebsocketConsumer 和异步方法,然后您可以使用asyncio 中的睡眠方法。

time.sleep 将阻止您的整个服务器。

-- 不相关 你应该发送 delayed.message 而不是 delayed_message (调用函数时,频道将 . 替换为 _)

【讨论】:

  • 否(见更新)。问题不在于服务器被阻止 - 这个动作永远不会执行。
  • 在您的消费者中,您是否订阅了5e001793-18be-4a4b-8caf-c4a8144a11d2 组
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-28
  • 1970-01-01
  • 2019-01-18
  • 2021-11-28
  • 1970-01-01
  • 2021-09-30
  • 2018-10-11
相关资源
最近更新 更多