{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import socket\n", "import time\n", "import requests\n", "import subprocess\n", "import os\n", "\n", "class ComfyUI:\n", " def __init__(self):\n", " self.process = None\n", " self.port = None\n", " self.SS()\n", "\n", " def is_port_in_use(self , port , host='127.0.0.1'):\n", " with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:\n", " s.settimeout(1)\n", " try:\n", " s.bind((host, port))\n", " except socket.error:\n", " return True \n", " return False \n", " \n", " def is_server_ready(self , url, timeout=30):\n", " start_time = time.time()\n", " while True:\n", " try:\n", " response = requests.get(url)\n", " if response.status_code == 200:\n", " return True\n", " except requests.RequestException:\n", " pass\n", " \n", " if time.time() - start_time > timeout:\n", " return False\n", " time.sleep(1) \n", " \n", " def SS(self):\n", " try:\n", " port_to_check = 60000\n", " con_count = 0\n", " while(True):\n", " if con_count > 100:\n", " return False\n", " if self.is_port_in_use(port_to_check):\n", " port_to_check = port_to_check + 1\n", " con_count = con_count + 1\n", " else:\n", " break\n", " \n", " port_to_check = str(port_to_check)\n", " script_dir = \"./ComfyUI/ComfyUI\"\n", " script_dir = os.path.abspath(script_dir)\n", "\n", " code_dir = \"./ComfyUI/ComfyUI/main.py\"\n", " code_dir = os.path.abspath(code_dir)\n", "\n", " command = [\"/home/itek/miniconda3/envs/ai/bin/python\", os.path.abspath(code_dir), \"--port\", port_to_check, '--listen' , '127.0.0.1']\n", " self.process = subprocess.Popen(command, cwd=script_dir , stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)\n", " self.port = port_to_check\n", "\n", " return True\n", " \n", " except Exception as e: \n", " print(e)\n", " return False\n", " \n", " def restart_if_down(self):\n", "\n", " if self.port is None:\n", " return False\n", " \n", " server_url = f\"http://127.0.0.1:{self.port}\"\n", " if not self.is_server_ready(server_url, timeout=5):\n", " \n", " if self.process is not None:\n", " self.process.terminate()\n", " self.process.kill()\n", " self.process = None\n", " self.port = None\n", "\n", " return self.SS()\n", "\n", " return True\n", "\n", " def __del__(self):\n", " if self.process is not None:\n", " self.process.terminate()\n", " self.process.kill()" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "ui = ComfyUI()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ui.restart_if_down()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "ui.process.kill()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'60001'" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ui.port" ] } ], "metadata": { "kernelspec": { "display_name": "ai", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.3" } }, "nbformat": 4, "nbformat_minor": 2 }