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