code: def internal_api(args):
      """Start Airflow Internal API."""
      print(settings.HEADER)
  
      access_logfile = args.access_logfile or "-"
      error_logfile = args.error_logfile or "-"
      access_logformat = args.access_logformat
      num_workers = args.workers
      worker_timeout = args.worker_timeout
  
      if args.debug:
          log.info(
              f"Starting the Internal API server on port {args.port} and host {args.hostname}."
          )
          app = create_app(
              testing=conf.getboolean("core", "unit_test_mode")
          )
          app.run(
              debug=True,  # nosec
              use_reloader=not app.config["TESTING"],
              port=args.port,
              host=args.hostname,
          )
      else:
          log.info(
              textwrap.dedent(
                  f"""\
                  Running the Gunicorn Server with:
                  Workers: {num_workers} {args.workerclass}
                  Host: {args.hostname}:{args.port}
                  Timeout: {worker_timeout}
                  Logfiles: {access_logfile} {error_logfile}
                  Access Logformat: {access_logformat}
                  ================================================================="""
              )
          )
  
          pid_file, _, _, _ = setup_locations(
              "internal-api", pid=args.pid
          )
  
          run_args = [
              sys.executable,
              "-m",
              "gunicorn",
              "--workers",
              str(num_workers),
              "--worker-class",
              str(args.workerclass),
              "--timeout",
              str(worker_timeout),
              "--bind",
              args.hostname + ":" + str(args.port),
              "--name",
              "airflow-internal-api",
              "--pid",
              pid_file,
              "--access-logfile",
              str(access_logfile),
              "--error-logfile",
              str(error_logfile),
          ]
  
          if args.access_logformat and args.access_logformat.strip():
              run_args += [
                  "--access-logformat",
                  str(args.access_logformat),
              ]
  
          if args.daemon:
              run_args += ["--daemon"]
  
          run_args += [
              "airflow.cli.commands.internal_api_command:cached_app()"
          ]
  
          # To prevent different workers creating the web app and
          # all writing to the database at the same time, we use the --preload option.
          # With the preload option, the app is loaded before the workers are forked, and each worker will
          # then have a copy of the app
          run_args += ["--preload"]
  
          def kill_proc(
              signum: int,
              gunicorn_master_proc: psutil.Process | subprocess.Popen,
          ):
              log.info("Received signal: %s. Closing gunicorn.", signum)
              gunicorn_master_proc.terminate()
              with suppress(TimeoutError):
                  gunicorn_master_proc.wait(timeout=30)
              if isinstance(gunicorn_master_proc, subprocess.Popen):
                  still_running = (
                      gunicorn_master_proc.poll() is not None
                  )
              else:
                  still_running = gunicorn_master_proc.is_running()
              if still_running:
                  gunicorn_master_proc.kill()
              sys.exit(0)
  
          def monitor_gunicorn(
              gunicorn_master_proc: psutil.Process | subprocess.Popen,
          ):
              # Register signal handlers
              signal.signal(
                  signal.SIGINT,
                  lambda signum, _: kill_proc(
                      signum, gunicorn_master_proc
                  ),
              )
              signal.signal(
                  signal.SIGTERM,
                  lambda signum, _: kill_proc(
                      signum, gunicorn_master_proc
                  ),
              )
  
              # These run forever until SIG{INT, TERM, KILL, ...} signal is sent
              GunicornMonitor(
                  gunicorn_master_pid=gunicorn_master_proc.pid,
                  num_workers_expected=num_workers,
                  master_timeout=120,
                  worker_refresh_interval=30,
                  worker_refresh_batch_size=1,
                  reload_on_plugin_change=False,
              ).start()
  
          def start_and_monitor_gunicorn(args):
              if args.daemon:
                  subprocess.Popen(run_args, close_fds=True)
  
                  # Reading pid of gunicorn master as it will be different that
                  # the one of process spawned above.
                  gunicorn_master_proc_pid = None
                  while not gunicorn_master_proc_pid:
                      sleep(0.1)
                      gunicorn_master_proc_pid = read_pid_from_pidfile(
                          pid_file
                      )
  
                  # Run Gunicorn monitor
                  gunicorn_master_proc = psutil.Process(
                      gunicorn_master_proc_pid
                  )
                  monitor_gunicorn(gunicorn_master_proc)
              else:
                  with subprocess.Popen(
                      run_args, close_fds=True
                  ) as gunicorn_master_proc:
                      monitor_gunicorn(gunicorn_master_proc)
  
          if args.daemon:
              # This makes possible errors get reported before daemonization
              os.environ["SKIP_DAGS_PARSING"] = "True"
              create_app(None)
              os.environ.pop("SKIP_DAGS_PARSING")
  
          pid_file_path = Path(pid_file)
          monitor_pid_file = str(
              pid_file_path.with_name(
                  f"{pid_file_path.stem}-monitor{pid_file_path.suffix}"
              )
          )
          run_command_with_daemon_option(
              args=args,
              process_name="internal-api",
              callback=lambda: start_and_monitor_gunicorn(args),
              should_setup_logging=True,
              pid_file=monitor_pid_file,
          )
  
imports: from __future__ import annotations
  import logging
  import os
  import signal
  import subprocess
  import sys
  import textwrap
  from contextlib import suppress
  from pathlib import Path
  from tempfile import gettempdir
  from time import sleep
  import psutil
  from flask import Flask
  from flask_appbuilder import SQLA
  from flask_caching import Cache
  from flask_wtf.csrf import CSRFProtect
  from lockfile.pidlockfile import read_pid_from_pidfile
  from sqlalchemy.engine.url import make_url
  from airflow import settings
  from airflow.api_internal.internal_api_call import InternalApiConfig
  from airflow.cli.commands.daemon_utils import run_command_with_daemon_option
  from airflow.cli.commands.webserver_command import GunicornMonitor
  from airflow.configuration import conf
  from airflow.exceptions import AirflowConfigException
  from airflow.logging_config import configure_logging
  from airflow.models import import_all_models
  from airflow.utils import cli
  from airflow.utils.cli import setup_locations
  from airflow.utils.providers_configuration_loader import providers_configuration_loaded
  from airflow.www.extensions.init_dagbag import init_dagbag
  from airflow.www.extensions.init_jinja_globals import init_jinja_globals
  from airflow.www.extensions.init_manifest_files import configure_manifest_files
  from airflow.www.extensions.init_security import init_xframe_protection
  from airflow.www.extensions.init_views import init_api_internal, init_error_handlers
label_desc: Use image node_id 1 for calling a global function with example usage: internal_api(args) without return types