diff --git a/invokeai/app/api_app.py b/invokeai/app/api_app.py index 4afa3aa161..fa4643d934 100644 --- a/invokeai/app/api_app.py +++ b/invokeai/app/api_app.py @@ -4,6 +4,7 @@ import sys from inspect import signature import uvicorn +import socket from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware @@ -193,9 +194,20 @@ app.mount("/", ) def invoke_api(): + def find_port(port: int): + """Find a port not in use starting at given port""" + # Taken from https://waylonwalker.com/python-find-available-port/, thanks Waylon! + # https://github.com/WaylonWalker + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + if s.connect_ex(("localhost", port)) == 0: + return find_port(port=port + 1) + else: + return port + + port = find_port(app_config.port) # Start our own event loop for eventing usage loop = asyncio.new_event_loop() - config = uvicorn.Config(app=app, host=app_config.host, port=app_config.port, loop=loop) + config = uvicorn.Config(app=app, host=app_config.host, port=port, loop=loop) # Use access_log to turn off logging server = uvicorn.Server(config) loop.run_until_complete(server.serve())