| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- import os.path
- import time
- from concurrent.futures import ThreadPoolExecutor, wait
- import threading
- from middleware import UnicornException
- from .deal_one_image import DealOneImage, DealOneImageBeforehand
- from logger import logger
- from .online_request.module_online_data import GetOnlineDataHLM
- class DealCutout():
- # signal_data = Signal(dict)
- def __init__(self, windows,token):
- super().__init__()
- self.windows = windows
- self.token = token
- self.lock = threading.Lock()
- self.need_cutout_images = {}
- self.state = 2 # 1进行中 2停止 状态 用于中途取消, 3已结束
- # 当前阿里预处理后的图片数量(未消费)
- self.is_upload_pic_num = 0
- self.is_deal_num = 0
- # 图片列表
- self.upload_pic_dict = {}
- self.logger = logger
- self.remaining_times = 0 # 剩余总次数
- self.get_online_data = GetOnlineDataHLM(token)
- self.resultData = [] # 最终的结果
- def refresh_times(self, is_online=True, remaining_times=None):
- # 刷新剩余次数
- if remaining_times is not None:
- self.remaining_times = remaining_times
- if is_online:
- _ = self.get_online_data.get_cutout_image_times()
- if _ is False:
- self.remaining_times = 0
- else:
- if "balance" in _:
- self.remaining_times = _["balance"]
- if self.remaining_times <= 0:
- return False
- return True
- def send_sign(self, data):
- # show_info complete
- self.signal_data.emit(data)
- def check_before(self):
- self.refresh_times()
- if self.remaining_times <= 0:
- # self.send_sign({"type": "show_info",
- # "message": "精细化抠图余量不足",
- # })
- raise UnicornException("精细化抠图余量不足")
- return True
- def run(self):
- """
- need_cutout_images 结构:
- [
- "file_name": file_name, # 文件名
- "file_e": file_e, # 后缀,.jpg
- "file_path": image_path, # 完整路径
- "file": file, # 图片文件名,带后缀
- "need_cutout": True,# 必须,需要抠图
- "out_path":图片输出路径
- ]
- """
- if not self.check_before():
- # self.signal_data.emit({"_type": "complete",
- # "data": []})
- self.state = 3
- return
- # executor = ThreadPoolExecutor(max_workers=4)
- # executor_pic_upload = ThreadPoolExecutor(max_workers=2)
- # tasks_1 = []
- # tasks_2 = []
- self.state = 1
- self.resultData = []
- self.is_upload_pic_num = 0
- self.is_deal_num = 0
- num = 0
- success_image_path = []
- for image_data in self.need_cutout_images:
- if not image_data["need_cutout"]:
- continue
- num += 1
- deal2 = DealOneImageBeforehand(
- image_data=image_data,
- lock=self.lock,
- windows=self,
- num=num,
- token=self.token,
- )
- res2 = deal2.run()
- try:
- image_path = res2
- if image_path:
- if isinstance(image_path, str):
- if os.path.exists(image_path):
- success_image_path.append(image_path)
- except BaseException as e:
- self.logger.info("有线程出错:{}".format(e))
- deal1 = DealOneImage(
- image_data=image_data,
- lock=self.lock,
- windows=self,
- num=num,
- token=self.token,
- )
- res1 = deal1.run()
- # tasks_1.append(task_1)
- print("res1===>", res1)
- try:
- image_path = res1
- if image_path:
- if isinstance(image_path, str):
- if os.path.exists(image_path):
- success_image_path.append(image_path)
- except BaseException as e:
- self.logger.info("有线程出错:{}".format(e))
- # self.check_thread(tasks_1, tasks_2)
- self.resultData = success_image_path
- self.state = 3
- def __del__(self):
- self.state = 2
- def check_thread(self, *tasks_list):
- time.sleep(2)
- success_image_path = []
- while 1:
- f = True
- for tasks in tasks_list:
- done, not_done = wait(tasks)
- if not_done:
- time.sleep(2)
- f = False
- continue
- for task in done:
- try:
- image_path = task.result()
- if image_path:
- if isinstance(image_path, str):
- if os.path.exists(image_path):
- success_image_path.append(image_path)
- except BaseException as e:
- self.logger.info("有线程出错:{}".format(e))
- if f:
- break
- # self.signal_data.emit({"_type": "complete",
- # "data": success_image_path})
- self.resultData = success_image_path
- self.state = 3
|