使用来自新进程的消费者类外部的 Django 通道发送消息

时间:2021-06-03 10:29:19

标签: python django django-channels

我正在 Django 中构建一个 REST Api,用于训练和预测一些数据。我有一个 websocket 连接,目的是进行双向通信。对于非阻塞服务器,当有人想要训练新模型时,我决定使用多处理中的新进程。一切正常,但当该流程的培训结束时,我无法发回消息。

这是我的consumer.py类

import json
from asgiref.sync import sync_to_async
from channels.generic.websocket import AsyncJsonWebsocketConsumer, AsyncWebsocketConsumer
import time
import asyncio
from multiprocessing import Process
from .train import train

from threading import Thread

from channels.layers import get_channel_layer

class Consumer(AsyncJsonWebsocketConsumer):
    async def connect(self):
        await self.channel_layer.group_add("gossip", self.channel_name)
        await self.accept()

    async def disconnect(self, close_code):
        pass

    # Receive message from WebSocket
    async def receive(self, text_data):
        print(text_data)
        
        await self.send(text_data=json.dumps({
            'message': text_data
        }))

        data = "Works good"
        p = Process(target=train, args=(data,))
        p.start()

    # Receive message from room group
    async def chat_message(self, event):
        message = event['message']

        # Send message to WebSocket
        await self.send(text_data=json.dumps({
            'message': message
        }))

    async def sendMessageTrain(self):
        await self.send(text_data=json.dumps({
            'message': "Model success trained"
        }))

    async def notify(self, event):
        print("In notify method: Notify")
        print(event["content"])
        await self.send(text_data=json.dumps({
            'message': event["content"]
        }))

通道层设置:

CHANNEL_LAYERS = {
    "default": {
        "BACKEND": "channels.layers.InMemoryChannelLayer"
        # "BACKEND": "channels_redis.core.RedisChannelLayer",
        # "CONFIG": {"hosts": [("localhost", 6379)]},
    }
}

和 train.py 类:

from asyncio.windows_events import NULL
import time
from channels.layers import get_channel_layer
import asyncio

def train(data):
    print(data)
    print("Enter delay 10 seconds")
    time.sleep(10)
    print("Exit delay 10 seconds")
    # channel_layer = get_channel_layer()
    # print(channel_layer)
    # print(channel_layer.capacity)
    # print(channel_layer.valid_group_name)

    loop = asyncio.new_event_loop()
    loop.run_until_complete(
        sendMessage(data)
    )

    # loop = asyncio.get_event_loop()
    # loop.creat_task(
    # channel_layer.group_send("gossip", {
    #             'type': 'notify',  # This routes it to this handler.
    #             'content': data+"Message back",
    #             })
    # )

async def sendMessage(data):
    print("sendMessage1")
    channel_layer = get_channel_layer()
    await channel_layer.group_send("gossip", {
                'type': 'notify',  # This routes it to this handler.
                'content': "Message back from train method",
                })
    print("sendMessage2")

0 个答案:

没有答案
相关问题