Django фоновый рабочий канал каналов не принимает сообщения, используя InMemoryChannelLayer - PullRequest
1 голос
/ 07 августа 2020

Я пытаюсь реализовать фонового рабочего, который в конечном итоге прочитает файл журнала и отправит его обратно через веб-сокет клиенту. В настоящее время сообщение не доставляется работнику.

Я использую InMemoryChannelLayer, работает ли это с использованием этого слоя по умолчанию, или мне придется вместо этого использовать Redis?

#consumer
channel_layer = get_channel_layer()

class LogFileConsumer(AsyncConsumer):

    async def read_file(self, message):
        print(message)
        await asyncio.sleep(2)
        
class LogConsumer(AsyncWebsocketConsumer):
# group_send code, not shown, is routed back fine to the client browser
    async def connect(self):
        await self.accept()
        await channel_layer.send('read-file',{
            'type': 'read.file',
            'id':'start',
        })
#routing
application = ProtocolTypeRouter({
    'websocket': AuthMiddlewareStack(
        URLRouter(
            log_reader.routing.websocket_urlpatterns
        )
    ),
    'channel': ChannelNameRouter({
        'read-file': LogFileConsumer,
    }),
})

Затем я запускаю воркера следующим образом:

$ python manage.py runworker read-file
Running worker for channels ['read-file']

Я ожидал бы увидеть сообщение, напечатанное на консоли, но ничего не возвращается.

Остальной код, получение сообщения из браузера через веб-сокет и отправка обратно клиенту с помощью group_send отлично работает. Я уверен, что где-то есть глупая ошибка, просто не могу ее обнаружить.

Спасибо

1 Ответ

1 голос
/ 09 августа 2020

Уровень в памяти предназначен только для тестирования et c (например, запуска модульных тестов в репозитории канала).

Вы всегда должны использовать уровень Redis (или другой, например RabbitMQ).

...