diff --git a/change_app.py b/change_app.py index 12d78d3..518798c 100644 --- a/change_app.py +++ b/change_app.py @@ -506,6 +506,33 @@ def pushStr2Queue(key, data_str): else: logger.error(f"pushStr2Queue get lock error {data_str}") +def queueCall(data): + key = str(uuid.uuid4()) + redis_conn = get_redis_conn() + + task_data = {} + task_data['key'] = key + task_data['api'] = "/do_change_cloth" + task_data['request'] = data + logger.info(f"request do_change_cloth img:{data['human_url'][:64]}, output_format:{data['output_format']}") + task_data_str = json.dumps(task_data) + pushStr2Queue(key, task_data_str) + start_time = datetime.now() + result_key = f"result_{key}" + result_status_key = f"result_status_code_{key}" + while (datetime.now() - start_time).seconds < DEFAULT_TIMEOUT: + if redis_conn.exists(result_key): + result_str = redis_conn.get(result_key) + return result_str, int(redis_conn.get(result_status_key)), {'Content-Type': 'application/json'} + time.sleep(0.1) + + logger.error(f"request hairColor time out ") + return jsonify({ + 'msg': f'Timeout after time out' + , "state":-1, "data":"" + }), 408 + + @app.route('/change_cloth', methods=['POST']) def change_cloth(): """从 URL 下载图片""" @@ -521,35 +548,42 @@ def change_cloth(): output_format = data.get('output_format') if not output_format: - return jsonify({"state":-1, "error": "Missing 'cloth_url' parameter"}), 500 + return jsonify({"state":-1, "error": "Missing 'output_format' parameter"}), 500 + return queueCall(data) + +@app.route('/change_cloth_base64', methods=['POST']) +def change_cloth_base64(): + # 获取参数 + data = request.get_json() + if not data: + return jsonify({"ret":-1, "state":-1, 'msg': 'No JSON data provided'}), 400 + + human_img = data.get('human_img') + cloth_img = data.get('cloth_img') + output_format = data.get('output_format') + if not output_format: + return jsonify({"state":-1, "error": "Missing 'output_format' parameter"}), 500 - key = str(uuid.uuid4()) - redis_conn = get_redis_conn() + if not human_img or not cloth_img: + return jsonify({"ret":-1, 'msg': 'Both human_img and cloth_img are required'}), 400 + + human_filename = save_base64_image(human_img, 'human') + if not human_filename: + return jsonify({"ret":-1, 'msg': 'Failed to save human image'}), 500 + + human_url = f"http://112.126.94.241:18888/static/imgs/{human_filename}" - task_data = {} - task_data['key'] = key - task_data['api'] = "/do_change_cloth" - task_data['request'] = data - logger.info(f"request do_change_cloth img:{data['human_url'][:64]}, output_format:{data['output_format']}") - task_data_str = json.dumps(task_data) - pushStr2Queue(key, task_data_str) - timeout = DEFAULT_TIMEOUT - start_time = datetime.now() - result_key = f"result_{key}" - result_status_key = f"result_status_code_{key}" - while (datetime.now() - start_time).seconds < timeout: - if redis_conn.exists(result_key): - result_str = redis_conn.get(result_key) - return result_str, int(redis_conn.get(result_status_key)), {'Content-Type': 'application/json'} - time.sleep(0.1) - - logger.error(f"request hairColor time out ") - return jsonify({ - 'msg': f'Timeout after {timeout} seconds, http time out' - , "state":-1, "data":"" - }), 408 + # 保存服装图片 + cloth_filename = save_base64_image(cloth_img, 'cloth') + if not cloth_filename: + return jsonify({"ret":-1, 'msg': 'Failed to save cloth image'}), 500 + + cloth_url = f"http://112.126.94.241:18888/static/imgs/{cloth_filename}" + data["human_url"] = human_url + data["cloth_url"] = cloth_url + return queueCall(data) if __name__ == '__main__': diff --git a/config.py b/config.py index 55f56c6..7e6c19f 100644 --- a/config.py +++ b/config.py @@ -16,6 +16,7 @@ KEY_QUEUE_LOCK_NAME = 'KEY_QUEUE_LOCK_NAME' SERVER_LIST_LOCK_NAME = 'SERVER_LIST_LOCK_NAME' SERVER_LIST_LOG_LOCK_NAME = 'SERVER_LIST_LOG_LOCK_NAME' + # 创建 logger logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) # 设置 logger 的级别 diff --git a/monitor.py b/monitor.py index 88740a5..7940f54 100644 --- a/monitor.py +++ b/monitor.py @@ -72,13 +72,13 @@ def get_server_state(): @monitor.route('/') def serve_index(): - return send_from_directory('static', 'index.html') + return send_from_directory('static', 'monitor.html') if __name__ == '__main__': # 启动Flask应用,启用多线程处理 monitor.run( host='0.0.0.0', - port=5001, - threaded=True, # 启用多线程处理并发请求 + port=8018, + threaded=False, # 启用多线程处理并发请求 debug=False # 生产环境应设置为False ) diff --git a/static/monitor.html b/static/monitor.html new file mode 100644 index 0000000..f45055a --- /dev/null +++ b/static/monitor.html @@ -0,0 +1,382 @@ + + + + + + 服务器状态监控 + + + +
+

服务器状态监控

+
+ +
+
+ 最后更新时间: - +
+
+ +
+
+ + + + \ No newline at end of file diff --git a/worker.py b/worker.py index 948b242..687b6b5 100644 --- a/worker.py +++ b/worker.py @@ -8,7 +8,7 @@ import threading import json from datetime import datetime, timedelta -from config import REDIS_HOST +from config import REDIS_HOST, DEFAULT_TIMEOUT from config import REDIS_PORT from config import REDIS_DB from config import QUEUE_NAME @@ -201,7 +201,7 @@ def call_remote_gpu_server(task_data_str, server=None): if data['output_format'] == 'base64': base64 = True - response = requests.post(url, headers=headers, json=data, timeout=30) + response = requests.post(url, headers=headers, json=data, timeout=DEFAULT_TIMEOUT) logger.info(f"call finshed {response.status_code} {response.headers} {response.text[:128]}") if response.status_code == 200: @@ -260,9 +260,9 @@ def call_remote_gpu_server(task_data_str, server=None): result_status_code = '500' result_key = f"result_{key}" - redis_conn.set(result_key, result_str, ex=60) + redis_conn.set(result_key, result_str, ex=DEFAULT_TIMEOUT) result_status_key = f"result_status_code_{key}" - redis_conn.set(result_status_key, result_status_code, ex=60) + redis_conn.set(result_status_key, result_status_code, ex=DEFAULT_TIMEOUT) def get_task_queue_key(): @@ -315,7 +315,6 @@ if __name__ == '__main__': print(f"[Worker] Starting with PID: {os.getpid()}") redis_conn.set(GPU_SERVER_LIST, "[]") - servers = regServer("localhost") - for s in servers: - regServer(s) + regServer("localhost") + main_worker() \ No newline at end of file