Django 使用 InMemoryChannelLayer 通道后台工作者不接收消息

Django channels background worker not picking up messages, using InMemoryChannelLayer

我正在尝试实现一个后台工作程序,它最终会读取日志文件并通过 websocket 将其发送回客户端。目前消息未传递给工作人员。

我正在使用 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']

我希望看到一条消息打印回控制台,但没有任何返回。

其余代码,通过 websocket 从浏览器接收消息,并使用 group_send 发送回客户端工作正常。我确定某处有一个愚蠢的错误,只是无法发现它。

谢谢

内存层仅用于测试等(例如运行通道回购上的单元测试)。

您应该始终使用 Redis(或其他,如 RabbitMQ)层。