django каналов - отложенный обмен сообщениями не работает - PullRequest
1 голос
/ 09 марта 2020

Я пытаюсь имитировать длительный 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)

1 Ответ

0 голосов
/ 09 марта 2020

вы должны использовать AsyncJsonWebsocketConsumer и asyn c методы, тогда вы можете использовать метод сна из asyncio.

time.sleep заблокирует весь ваш сервер.

- независимо от того, вы должны отправлять delayed.message, а не delayed_message (каналы заменяются на _ при вызове функций)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...