deal_cutout.py 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. import os.path
  2. import time
  3. from concurrent.futures import ThreadPoolExecutor, wait
  4. import threading
  5. from import_qt_mode import *
  6. from module.cutout_mode.deal_one_image import DealOneImage, DealOneImageBeforehand
  7. from module.log.log import MyLogger
  8. from module.online_request.module_online_data import GetOnlineDataHLM
  9. class DealCutout(QThread):
  10. signal_data = Signal(dict)
  11. def __init__(self, windows):
  12. super().__init__()
  13. self.windows = windows
  14. self.lock = threading.Lock()
  15. self.need_cutout_images = {}
  16. self.state = 2 # 1进行中 2停止 状态 用于中途取消, 3已结束
  17. # 当前阿里预处理后的图片数量(未消费)
  18. self.is_upload_pic_num = 0
  19. self.is_deal_num = 0
  20. # 图片列表
  21. self.upload_pic_dict = {}
  22. self.logger = MyLogger().logger
  23. self.remaining_times = 0 # 剩余总次数
  24. self.get_online_data = GetOnlineDataHLM()
  25. self.resultData = [] # 最终的结果
  26. def refresh_times(self, is_online=True, remaining_times=None):
  27. # 刷新剩余次数
  28. if remaining_times is not None:
  29. self.remaining_times = remaining_times
  30. if is_online:
  31. _ = self.get_online_data.get_cutout_image_times()
  32. if _ is False:
  33. self.remaining_times = 0
  34. else:
  35. if "balance" in _:
  36. self.remaining_times = _["balance"]
  37. if self.remaining_times <= 0:
  38. return False
  39. return True
  40. def send_sign(self, data):
  41. # show_info complete
  42. self.signal_data.emit(data)
  43. def check_before(self):
  44. self.refresh_times()
  45. if self.remaining_times <= 0:
  46. self.send_sign({"type": "show_info",
  47. "message": "精细化抠图余量不足",
  48. })
  49. return False
  50. return True
  51. def run(self):
  52. """
  53. need_cutout_images 结构:
  54. [
  55. "file_name": file_name, # 文件名
  56. "file_e": file_e, # 后缀,.jpg
  57. "file_path": image_path, # 完整路径
  58. "file": file, # 图片文件名,带后缀
  59. "need_cutout": True,# 必须,需要抠图
  60. "out_path":图片输出路径
  61. ]
  62. """
  63. if not self.check_before():
  64. self.signal_data.emit({"_type": "complete",
  65. "data": []})
  66. self.state = 3
  67. return
  68. executor = ThreadPoolExecutor(max_workers=4)
  69. executor_pic_upload = ThreadPoolExecutor(max_workers=2)
  70. tasks_1 = []
  71. tasks_2 = []
  72. self.state = 1
  73. self.resultData = []
  74. self.is_upload_pic_num = 0
  75. self.is_deal_num = 0
  76. num = 0
  77. for image_data in self.need_cutout_images:
  78. if not image_data["need_cutout"]:
  79. continue
  80. num += 1
  81. task_1 = executor.submit(DealOneImage(image_data=image_data, lock=self.lock, windows=self, num=num).run)
  82. tasks_1.append(task_1)
  83. task_2 = executor_pic_upload.submit(
  84. DealOneImageBeforehand(image_data=image_data, lock=self.lock, windows=self, num=num).run)
  85. tasks_2.append(task_2)
  86. self.check_thread(tasks_1, tasks_2)
  87. def __del__(self):
  88. self.state = 2
  89. def check_thread(self, *tasks_list):
  90. time.sleep(2)
  91. success_image_path = []
  92. while 1:
  93. f = True
  94. for tasks in tasks_list:
  95. done, not_done = wait(tasks)
  96. if not_done:
  97. time.sleep(2)
  98. f = False
  99. continue
  100. for task in done:
  101. try:
  102. image_path = task.result()
  103. if image_path:
  104. if isinstance(image_path, str):
  105. if os.path.exists(image_path):
  106. success_image_path.append(image_path)
  107. except BaseException as e:
  108. self.logger.info("有线程出错:{}".format(e))
  109. if f:
  110. break
  111. self.signal_data.emit({"_type": "complete",
  112. "data": success_image_path})
  113. self.resultData = success_image_path
  114. self.state = 3