8 changed files with 179 additions and 83 deletions
@ -0,0 +1,76 @@ |
|||||
|
import multiprocessing |
||||
|
|
||||
|
from threading import Lock |
||||
|
from core.ModelNode import ModelNode |
||||
|
from myutils.ConfigManager import myCongif |
||||
|
|
||||
|
class ModelNodeManger: |
||||
|
def __init__(self,device_id,model_id,model_path,threshold=0.5,iou_thres=0.5): |
||||
|
self.ch_count = 0 #当前模型关联的通道数量 |
||||
|
self.channel_list = {} #channel_id modelNodle |
||||
|
self.clist_Lock = Lock() # count的维护锁 |
||||
|
self.modelNode_list = [] # model_Node |
||||
|
self.brun = multiprocessing.Value('b',True) #brun.value = False,brun.value = True |
||||
|
self.m_p_status = multiprocessing.Value('i',0) |
||||
|
self.model = None # 模型对象 |
||||
|
#------- |
||||
|
self.max_count = myCongif.get_data('maxCount') |
||||
|
self.device_id = device_id |
||||
|
self.model_id = model_id |
||||
|
self.model_path = model_path |
||||
|
self.threshold = threshold |
||||
|
self.iou_thres = iou_thres |
||||
|
|
||||
|
|
||||
|
# #添加数据 |
||||
|
# def pro_add_data(self,channel_id,data): |
||||
|
# pass |
||||
|
# # #加锁? -- 对于多线程这里的耗时会不会有点大。。。 model_nodel 反馈出去?????getModle_Nodel |
||||
|
# # with self.clist_Lock: |
||||
|
# # if channel_id in self.channel_list: |
||||
|
# # self.modelNode_list[channel_id].pro_add_data(data) |
||||
|
|
||||
|
#暴露modelNodel -- 避免pro_add_data锁竞争 |
||||
|
def getModle_Nodel(self,channel_id): |
||||
|
model_nodel = None |
||||
|
if channel_id in self.channel_list: |
||||
|
model_nodel = self.channel_list[channel_id] |
||||
|
return model_nodel |
||||
|
|
||||
|
def start_model_th(self, channel_id, out_mq): |
||||
|
with self.clist_Lock: |
||||
|
if channel_id in self.channel_list: #已经在List 说明已经启动过了,但不应该重复调用 |
||||
|
print("不应该重复调用start_model_th") |
||||
|
return True |
||||
|
else: # 还没入list ,查找可以插入的model_node |
||||
|
for model_node in self.modelNode_list: |
||||
|
if model_node.ch_count < self.max_count: # 没满可以插入 |
||||
|
model_node.start_model_th(channel_id, out_mq) #+1 |
||||
|
self.channel_list[channel_id] = model_node #新增 channel_di 与model_node的对应关系 |
||||
|
return True |
||||
|
# 执行到这说明没有空的model_nodel -- 需要新建 |
||||
|
model_node = ModelNode(self.device_id,self.model_path,self.max_count) |
||||
|
model_node.start_model_th(channel_id, out_mq) # 启动线程,并+1 |
||||
|
#两个数据结构,新增节点 |
||||
|
self.modelNode_list.append(model_node) #新增一个model_node节点 |
||||
|
self.channel_list[channel_id] = model_node #新增 channel_di 与model_node的对应关系 |
||||
|
#行动完更新数量 |
||||
|
self.ch_count +=1 |
||||
|
return True |
||||
|
|
||||
|
def stop_model_th(self, channel_id): |
||||
|
with self.clist_Lock: |
||||
|
if channel_id in self.channel_list: |
||||
|
model_node = self.channel_list[channel_id] |
||||
|
model_node.stop_model_th(channel_id) #减-,根据情况停止工作进程、 |
||||
|
# 需要考虑下model_node是否要删除,还是保留后重复利用- |
||||
|
if model_node.ch_count ==0: |
||||
|
self.modelNode_list.remove(model_node) #如何没有关联通道了,侧删除该modelnodel |
||||
|
del model_node #删除对象 |
||||
|
del self.channel_list[channel_id] #删除channel_id 与 model_node的对应关心节点 |
||||
|
#行动完更新数量 |
||||
|
self.ch_count -= 1 |
||||
|
return True |
||||
|
else: |
||||
|
print("不在list里面,不应该调用stop_model_th") |
||||
|
return False |
Loading…
Reference in new issue