我正在 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")