脚底板增加进程池
This commit is contained in:
1 parent
7ac04b969d
commit
e11272ddee
1 file changed
+137
-85
+137
-85
@@ -1,6 +1,7 @@
|
|||||||
import os, sys, bpy, math, time, platform, cairosvg, ppf.datamatrix, shutil, requests, json, redis, oss2, cv2,qrcode
|
import os, sys, bpy, math, time, platform, cairosvg, ppf.datamatrix, shutil, requests, json, redis, oss2, cv2,qrcode
|
||||||
from retrying import retry
|
from retrying import retry
|
||||||
import subprocess
|
import subprocess
|
||||||
|
import multiprocessing
|
||||||
import random
|
import random
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import matplotlib.pyplot as plt
|
import matplotlib.pyplot as plt
|
||||||
@@ -403,48 +404,9 @@ def remove_gray_and_sharpening(jpg_path):
|
|||||||
# show_histogram(input_image, img_id, low_x_thresh, high_x_thresh)
|
# show_histogram(input_image, img_id, low_x_thresh, high_x_thresh)
|
||||||
cv2.imwrite(jpg_path, high_output_image, [cv2.IMWRITE_JPEG_QUALITY, 95]) # 保存图片的质量是原图的 95%
|
cv2.imwrite(jpg_path, high_output_image, [cv2.IMWRITE_JPEG_QUALITY, 95]) # 保存图片的质量是原图的 95%
|
||||||
|
|
||||||
def main(workdir, r, print_id):
|
|
||||||
print('脚底板二维码程序开始运行...')
|
|
||||||
only_one = False
|
|
||||||
while True:
|
|
||||||
#随机休眠 1- 9
|
|
||||||
time.sleep(random.uniform(1, 9))
|
|
||||||
if print_id == '0':
|
|
||||||
try:
|
|
||||||
if r.llen('model:foot') == 0:
|
|
||||||
# print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), '队列为空,5秒后重试')
|
|
||||||
time.sleep(5)
|
|
||||||
continue
|
|
||||||
except Exception as e:
|
|
||||||
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), 'redis连接异常,5秒后重试')
|
|
||||||
print(e)
|
|
||||||
time.sleep(5)
|
|
||||||
r = redis.Redis(host='106.14.158.208', password='kcV2000', port=6379, db=6)
|
|
||||||
# r = redis.Redis(host='172.31.1.254', password='', port=6379, db=6)
|
|
||||||
# continue
|
|
||||||
# 打印队列里面的全部内容
|
|
||||||
print(f'当前model:foot队列长度:{r.llen("model:foot")}')
|
|
||||||
for i in r.lrange('model:foot', 0, -1):
|
|
||||||
print(i)
|
|
||||||
print_id = r.lpop('model:foot')
|
|
||||||
if print_id is None:
|
|
||||||
print_id = '0'
|
|
||||||
continue
|
|
||||||
#判断是否存在相同的值
|
|
||||||
isHaveAlready = 0
|
|
||||||
for i in r.lrange('model:foot', 0, -1):
|
|
||||||
if i == print_id:
|
|
||||||
isHaveAlready = 1
|
|
||||||
|
|
||||||
if isHaveAlready == 1:
|
|
||||||
print_id = '0'
|
|
||||||
continue
|
|
||||||
|
|
||||||
print_id = print_id.decode('utf-8')
|
|
||||||
else:
|
|
||||||
print(f'接收到运行一个{print_id}任务')
|
|
||||||
only_one = True
|
|
||||||
|
|
||||||
|
#获取该笔订单的信息,判断是否存在,不存在就跳过
|
||||||
|
def getInfoByPrintId(print_id):
|
||||||
res = requests.get(f'{get_pid_by_printid_url}?print_id={print_id}')
|
res = requests.get(f'{get_pid_by_printid_url}?print_id={print_id}')
|
||||||
print('获取pid:', f'{get_pid_by_printid_url}?print_id={print_id}', res.text)
|
print('获取pid:', f'{get_pid_by_printid_url}?print_id={print_id}', res.text)
|
||||||
resCode = json.loads(res.text)['code']
|
resCode = json.loads(res.text)['code']
|
||||||
@@ -455,57 +417,46 @@ def main(workdir, r, print_id):
|
|||||||
if tempMesg == "打印订单不存在":
|
if tempMesg == "打印订单不存在":
|
||||||
print(f"打印ID{print_id}打印订单不存在,跳过")
|
print(f"打印ID{print_id}打印订单不存在,跳过")
|
||||||
# res = requests.get(f'https://mp.api.suwa3d.com/api/footCode/deleteByPid?pid={pid}')
|
# res = requests.get(f'https://mp.api.suwa3d.com/api/footCode/deleteByPid?pid={pid}')
|
||||||
os.system(f'blender -b -P fill_dm_code.py')
|
#os.system(f'blender -b -P fill_dm_code.py')
|
||||||
return
|
return False
|
||||||
|
|
||||||
print("获取打印任务信息有问题,重新任务队列,打印id-",print_id,"重新执行脚底板任务,等待20s")
|
print("获取打印任务信息有问题,重新任务队列,打印id-",print_id,"重新执行脚底板任务,等待20s")
|
||||||
time.sleep(20)
|
time.sleep(20)
|
||||||
#将pid 重新扔进队列
|
#将pid 重新扔进队列
|
||||||
r.lpush("model:foot", print_id)
|
r.lpush("model:foot", print_id)
|
||||||
#重新调用脚底板程序
|
return False
|
||||||
#os.system(f'blender -b -P fill_dm_code.py')
|
return res.text
|
||||||
continue
|
|
||||||
use_foot_type = json.loads(res.text)['data']['use_foot_type']
|
|
||||||
pid = json.loads(res.text)['data']['pid']
|
|
||||||
order_id = json.loads(res.text)['data']['order_id']
|
|
||||||
|
|
||||||
filename = os.path.join(workdir, f'{pid}_{order_id}', find_obj(pid, order_id))
|
#获取订单的坐标信息,判断是否有,没有的话就重新生成坐标信息
|
||||||
print('导入obj文件:', filename)
|
def getQrPosition(print_id):
|
||||||
# return
|
#从云端获取qr_position,如果获取为空,调用cal_foot_position.py计算并上传qr_position,再重新读取qr_position.txt
|
||||||
if only_one:
|
|
||||||
print(f'接收到运行一个{print_id}任务,强制调用cal_foot_position.py计算并上传qr_position')
|
|
||||||
os.system(f'blender -b -P cal_foot_position.py -- {pid}_{order_id}_{print_id}')
|
|
||||||
print("延时20s,等待计算脚底板坐标")
|
|
||||||
time.sleep(20)
|
|
||||||
res = requests.get(f'{get_qr_position_url}?print_id={print_id}')
|
res = requests.get(f'{get_qr_position_url}?print_id={print_id}')
|
||||||
print('从云端获取的qr_position1:', res.text)
|
print('从云端获取的qr_position1:', res.text)
|
||||||
codeTemp = json.loads(res.text)['code']
|
codeTemp = json.loads(res.text)['code']
|
||||||
if str(codeTemp) == "-1":
|
if str(codeTemp) == "-1":
|
||||||
#移除该脚底板的面积处理
|
print(f"获取打印ID{print_id}的脚底板坐标失败,进行下一笔订单的处理")
|
||||||
res = requests.get(f'https://mp.api.suwa3d.com/api/footCode/deleteByPid?pid={pid}')
|
return False
|
||||||
os.system(f'blender -b -P fill_dm_code.py')
|
|
||||||
return
|
|
||||||
qr_position = json.loads(res.text)['data']['position_data']
|
qr_position = json.loads(res.text)['data']['position_data']
|
||||||
else:
|
|
||||||
#从云端获取qr_position,如果获取为空,调用cal_foot_position.py计算并上传qr_position,再重新读取qr_position.txt
|
|
||||||
res = requests.get(f'{get_qr_position_url}?print_id={print_id}')
|
|
||||||
print('从云端获取的qr_position2:', res.text)
|
|
||||||
|
|
||||||
codeTemp = json.loads(res.text)['code']
|
|
||||||
if str(codeTemp) == "-1":
|
|
||||||
continue
|
|
||||||
|
|
||||||
qr_position = json.loads(res.text)['data']['position_data']
|
|
||||||
print("云端获取的坐标数据",qr_position)
|
|
||||||
if qr_position == '':
|
if qr_position == '':
|
||||||
|
print(f"pid={pid},打印id={print_id} order_id={order_id},云端获取的坐标数据为空,进行重新计算")
|
||||||
time.sleep(3)
|
time.sleep(3)
|
||||||
print('qr_position为空,调用cal_foot_position.py计算并上传qr_position')
|
print('qr_position为空,调用cal_foot_position.py计算并上传qr_position')
|
||||||
os.system(f'blender -b -P cal_foot_position.py -- {pid}_{order_id}_{print_id}')
|
os.system(f'blender -b -P cal_foot_position.py -- {pid}_{order_id}_{print_id}')
|
||||||
print("延时20s,等待计算脚底板坐标")
|
print("延时20s,等待计算脚底板坐标")
|
||||||
time.sleep(20)
|
time.sleep(20)
|
||||||
res = requests.get(f'{get_qr_position_url}?print_id={print_id}')
|
res = requests.get(f'{get_qr_position_url}?print_id={print_id}')
|
||||||
|
print(f"pid={pid},打印id={print_id} order_id={order_id},重新获取qr_position",res.text)
|
||||||
print('从云端获取的qr_position3:', res.text)
|
print('从云端获取的qr_position3:', res.text)
|
||||||
|
if str(json.loads(res.text)['code']) == "-1":
|
||||||
|
print(f"pid={pid},打印id={print_id} order_id={order_id},重新获取qr_position 失败",res.text)
|
||||||
|
return False
|
||||||
qr_position = json.loads(res.text)['data']['position_data']
|
qr_position = json.loads(res.text)['data']['position_data']
|
||||||
|
if qr_position == '':
|
||||||
|
#跳过该笔订单
|
||||||
|
print(f"pid={pid},打印id={print_id} order_id={order_id},重新获取qr_position 为空,跳过脚底板的处理,执行下一笔任务")
|
||||||
|
#移除该脚底板的面积处理
|
||||||
|
res = requests.get(f'https://mp.api.suwa3d.com/api/footCode/deleteByPid?pid={pid}')
|
||||||
|
return False
|
||||||
else:
|
else:
|
||||||
qr_position = json.loads(qr_position)
|
qr_position = json.loads(qr_position)
|
||||||
|
|
||||||
@@ -513,9 +464,31 @@ def main(workdir, r, print_id):
|
|||||||
print("获取脚底坐标数据为空,重新任务队列,打印id-",print_id,"重新执行脚底板任务")
|
print("获取脚底坐标数据为空,重新任务队列,打印id-",print_id,"重新执行脚底板任务")
|
||||||
#将pid 重新扔进队列
|
#将pid 重新扔进队列
|
||||||
r.lpush("model:foot", print_id)
|
r.lpush("model:foot", print_id)
|
||||||
#重新调用脚底板程序
|
return False
|
||||||
#os.system(f'blender -b -P fill_dm_code.py')
|
|
||||||
continue
|
return qr_position
|
||||||
|
|
||||||
|
def main(workdir, r, print_id):
|
||||||
|
|
||||||
|
resText = getInfoByPrintId(print_id)
|
||||||
|
print(f"根据打印ID{print_id}获取订单信息-内容{resText}")
|
||||||
|
if resText == False:
|
||||||
|
print(f"根据打印ID{print_id}获取订单信息失败")
|
||||||
|
return
|
||||||
|
arrResText = json.loads(resText)
|
||||||
|
#订单的相关信息
|
||||||
|
use_foot_type = arrResText['data']['use_foot_type'] #构建类型
|
||||||
|
pid = arrResText['data']['pid'] #pid
|
||||||
|
order_id = arrResText['data']['order_id'] # order_id
|
||||||
|
|
||||||
|
#文件路劲
|
||||||
|
filename = os.path.join(workdir, f'{pid}_{order_id}', find_obj(pid, order_id))
|
||||||
|
print('导入obj文件:', filename)
|
||||||
|
|
||||||
|
#获取该笔订单的坐标
|
||||||
|
qr_position = getQrPosition(print_id)
|
||||||
|
if qr_position == False:
|
||||||
|
return
|
||||||
|
|
||||||
if type(qr_position) == str: qr_position = json.loads(qr_position)
|
if type(qr_position) == str: qr_position = json.loads(qr_position)
|
||||||
print(f'type of qr_position:{type(qr_position)}')
|
print(f'type of qr_position:{type(qr_position)}')
|
||||||
@@ -535,14 +508,16 @@ def main(workdir, r, print_id):
|
|||||||
# print(f'temp_foot_data---{temp_foot_data}')
|
# print(f'temp_foot_data---{temp_foot_data}')
|
||||||
gen_data_matrix(print_id,pid, qr_path)
|
gen_data_matrix(print_id,pid, qr_path)
|
||||||
#休眠1秒
|
#休眠1秒
|
||||||
time.sleep(1)
|
time.sleep(2)
|
||||||
#判断是否存在 qr_path,不存在就执行下一个任务
|
#判断是否存在 qr_path,不存在就执行下一个任务
|
||||||
if not os.path.exists(qr_path):
|
if not os.path.exists(qr_path):
|
||||||
#移除该脚底板的面积处理
|
#移除该脚底板的面积处理
|
||||||
|
print(f"pid={pid},打印id={print_id} order_id={order_id},生成的二维码为空,跳过脚底板的处理,执行下一笔任务")
|
||||||
res = requests.get(f'https://mp.api.suwa3d.com/api/footCode/deleteByPid?pid={pid}')
|
res = requests.get(f'https://mp.api.suwa3d.com/api/footCode/deleteByPid?pid={pid}')
|
||||||
os.system(f'blender -b -P fill_dm_code.py')
|
#os.system(f'blender -b -P fill_dm_code.py')
|
||||||
return
|
return
|
||||||
|
|
||||||
|
#在blender中贴上脚底板二维码的信息
|
||||||
|
|
||||||
# 导入obj文件,重置到标准单位
|
# 导入obj文件,重置到标准单位
|
||||||
bpy.ops.wm.read_homefile()
|
bpy.ops.wm.read_homefile()
|
||||||
@@ -584,7 +559,7 @@ def main(workdir, r, print_id):
|
|||||||
if not os.path.exists(jpg_path):
|
if not os.path.exists(jpg_path):
|
||||||
#移除该脚底板的面积处理
|
#移除该脚底板的面积处理
|
||||||
res = requests.get(f'https://mp.api.suwa3d.com/api/footCode/deleteByPid?pid={pid}')
|
res = requests.get(f'https://mp.api.suwa3d.com/api/footCode/deleteByPid?pid={pid}')
|
||||||
os.system(f'blender -b -P fill_dm_code.py')
|
#os.system(f'blender -b -P fill_dm_code.py')
|
||||||
return
|
return
|
||||||
|
|
||||||
jpg_img = Image.open(jpg_path)
|
jpg_img = Image.open(jpg_path)
|
||||||
@@ -602,7 +577,7 @@ def main(workdir, r, print_id):
|
|||||||
if not os.path.exists(qr_path):
|
if not os.path.exists(qr_path):
|
||||||
#移除该脚底板的面积处理
|
#移除该脚底板的面积处理
|
||||||
res = requests.get(f'https://mp.api.suwa3d.com/api/footCode/deleteByPid?pid={pid}')
|
res = requests.get(f'https://mp.api.suwa3d.com/api/footCode/deleteByPid?pid={pid}')
|
||||||
os.system(f'blender -b -P fill_dm_code.py')
|
#os.system(f'blender -b -P fill_dm_code.py')
|
||||||
return
|
return
|
||||||
|
|
||||||
qr_img = Image.open(qr_path)
|
qr_img = Image.open(qr_path)
|
||||||
@@ -634,7 +609,7 @@ def main(workdir, r, print_id):
|
|||||||
print_id = '0'
|
print_id = '0'
|
||||||
continue
|
continue
|
||||||
|
|
||||||
restart_current_process("blender -b -P fill_dm_code.py")
|
# restart_current_process("blender -b -P fill_dm_code.py")
|
||||||
|
|
||||||
#根据print_id 获取 短网址
|
#根据print_id 获取 短网址
|
||||||
def get_short_url(print_id):
|
def get_short_url(print_id):
|
||||||
@@ -683,6 +658,49 @@ def upload_jpg_mtl(pid, order_id, print_id):
|
|||||||
print("迁移文件出 yichang ")
|
print("迁移文件出 yichang ")
|
||||||
|
|
||||||
|
|
||||||
|
def worker(workdir, r, print_id):
|
||||||
|
"""每个子进程的工作函数,用于处理单个 print_id。"""
|
||||||
|
try:
|
||||||
|
main(workdir, r, print_id)
|
||||||
|
except Exception as e:
|
||||||
|
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), f"处理 print_id {print_id} 时出错: {e}")
|
||||||
|
|
||||||
|
def process_print_ids(workdir, r, pool_size):
|
||||||
|
"""监控 Redis 队列并并行处理 print_id,同时控制进程池的大小。"""
|
||||||
|
# 创建进程池
|
||||||
|
pool = multiprocessing.Pool(processes=pool_size)
|
||||||
|
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
# 如果队列为空,等待10秒后重试
|
||||||
|
if r.llen('model:foot') == 0:
|
||||||
|
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), '队列为空,10秒后重试')
|
||||||
|
time.sleep(10)
|
||||||
|
continue
|
||||||
|
|
||||||
|
# 从队列中取出一个 print_id
|
||||||
|
print_id = r.lpop('model:foot')
|
||||||
|
if print_id is None:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# 判断该 print_id 是否已经存在,避免重复处理
|
||||||
|
isHaveAlready = 0
|
||||||
|
for i in r.lrange('model:foot', 0, -1):
|
||||||
|
if i == print_id:
|
||||||
|
isHaveAlready = 1
|
||||||
|
break
|
||||||
|
if isHaveAlready == 1:
|
||||||
|
continue
|
||||||
|
|
||||||
|
# 如果 print_id 是唯一的,则将任务提交给进程池处理
|
||||||
|
print(f"正在处理 print_id: {print_id}")
|
||||||
|
pool.apply_async(worker, args=(workdir, r, print_id)) # 使用 apply_async 异步执行任务
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), f"出现异常错误: {e}")
|
||||||
|
r = create_redis_connection()
|
||||||
|
continue
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
atexit.register(common.notify,"打印工厂-本地虚拟木脚底板处理程序已停止一个")
|
atexit.register(common.notify,"打印工厂-本地虚拟木脚底板处理程序已停止一个")
|
||||||
low_y_limit = 25000
|
low_y_limit = 25000
|
||||||
@@ -714,17 +732,51 @@ if __name__ == '__main__':
|
|||||||
sourceFilePath = '/data/datasets/print'
|
sourceFilePath = '/data/datasets/print'
|
||||||
#脚底板最终保存的路径
|
#脚底板最终保存的路径
|
||||||
resFilePath = '/data/datasets/complate/objs'
|
resFilePath = '/data/datasets/complate/objs'
|
||||||
|
|
||||||
print("Usage: blender -b -P fill_dm_code.py")
|
print("Usage: blender -b -P fill_dm_code.py")
|
||||||
|
|
||||||
|
# 控制进程池的大小
|
||||||
|
pool_size = 2 # 设置最大并发进程数为4(根据需求调整)
|
||||||
|
|
||||||
|
# 创建一个进程池
|
||||||
|
pool = multiprocessing.Pool(processes=pool_size)
|
||||||
|
|
||||||
|
# 如果传递了参数,则处理特定的 print_ids
|
||||||
if len(sys.argv) == 5:
|
if len(sys.argv) == 5:
|
||||||
print_ids = sys.argv[-1]
|
print_ids = sys.argv[-1]
|
||||||
else:
|
|
||||||
print_ids = '0'
|
|
||||||
|
|
||||||
print(f"print_ids--{print_ids}")
|
|
||||||
for print_id in print_ids.split(','):
|
for print_id in print_ids.split(','):
|
||||||
main(workdir, r, print_id)
|
main(workdir, r, print_id)
|
||||||
|
else:
|
||||||
|
# 启动进程池,监控队列并并行处理 print_id
|
||||||
|
process_print_ids(workdir, r, pool_size)
|
||||||
|
|
||||||
|
# if len(sys.argv) == 5:
|
||||||
|
# print_ids = sys.argv[-1]
|
||||||
|
# for print_id in print_ids.split(','):
|
||||||
|
# main(workdir, r, print_id)
|
||||||
|
# else:
|
||||||
|
# while True:
|
||||||
|
# try:
|
||||||
|
# #判断队列是否为空
|
||||||
|
# if r.llen('model:foot') == 0:
|
||||||
|
# print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), '队列为空,10秒后重试')
|
||||||
|
# time.sleep(10)
|
||||||
|
# continue
|
||||||
|
# #不为空,取出队列的第一个值
|
||||||
|
# print_id = r.lpop('model:foot')
|
||||||
|
# if print_id is None:
|
||||||
|
# continue
|
||||||
|
# #判断是否存在相同的值
|
||||||
|
# isHaveAlready = 0
|
||||||
|
# for i in r.lrange('model:foot', 0, -1):
|
||||||
|
# if i == print_id:
|
||||||
|
# isHaveAlready = 1
|
||||||
|
# break
|
||||||
|
# if isHaveAlready == 1:
|
||||||
|
# continue
|
||||||
|
# #如果是唯一值, 则调用main函数
|
||||||
|
# main(workdir, r, print_id)
|
||||||
|
# except Exception as e:
|
||||||
|
# print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()), '出现异常错误,5秒后重试',e)
|
||||||
|
# r = create_redis_connection()
|
||||||
|
# continue
|
||||||
|
|
||||||
Reference in new issue
Block a user