翻了一下午csdn,终于找到了解决办法。
目前的想法:
主进程 接收客户端消息,创建子进程
子进程 创建进程池
处理信息,信息类型1 加载 keras模型
信息类型2 给进程池添加任务,让keras进行预测。
思路来自 : https://blog.csdn.net/jacke121/article/details/82658471
解决办法:
通过
from multiprocessing.managers import BaseManager
解决问题。
BaseManager可以对 类对象 进行分享。
# 文件名 KK.py 用来进行模型加载和分析的
class Keras_class():
def __init__(self):
self.label = {}
self.loadmode = {}
def load_model(self, infos):
'''
加载模型文件
'''
def reco_model(self,infos):
'''
处理模型文件
'''
# 主文件
from multiprocessing.managers import BaseManager
import KK
class child_kk(KK.Keras_class):
pass
class MyManager(BaseManager):
pass
def Manager2():
m=MyManager()
m.start()
return m
MyManager.register('child_vc',child_vc)
上述代码 一般不做修改。创建child_kk子类的原因就是 KK 文件 我不能动。所以就直接继承了。
class TcpServer:
def __init__(self):
self.soc = socket.socket(
self.soc = 创建出socket
self.epoll = select.epoll()
# 创建子进程
self.msg_queues = SimpleQueue()
self.msg_event = Event()
self.msg_process = Process(
target=self.deal_message_process,
args=(self.msg_queues,self.msg_event)
)
self.msg_process.start()# 子进程启动
def open_tcp(self):
self.epoll.register(self.soc.fileno(), select.EPOLLIN | select.EPOLLET)
循环判断epoll事件。若是客户端发消息了,则把消息放入队列中
处理信息子进程
def deal_message_process(self):
global_vc=Manager2()
vc = global_vc.child_vc()
self.pool = Pool(3)
#计算类
class CaqModel:
def matching_model(self,vc):
#vc就是加载好预测模型的对象