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)层。
我正在尝试实现一个后台工作程序,它最终会读取日志文件并通过 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)层。