class_docstr: Runs a dash application in a waitress-serve subprocess.
  
  This flavor is closer to production environment but slower.
class_docstr_tok: ["Runs","a","dash","application","in","a","waitress-serve","subprocess",".","This","flavor","is","closer","to","production","environment","but","slower","."]
docstr: Start the server with waitress-serve in process flavor.
docstr_tok: ["Start","the","server","with","waitress-serve","in","process","flavor","."]
code: def start(
      self,
      app_module=None,
      application_name="app",
      raw_command=None,
      port=8050,
      start_timeout=3,
  ):
      """Start the server with waitress-serve in process flavor."""
      if not (app_module or raw_command):  # need to set a least one
          logging.error(
              "the process runner needs to start with at least one valid command"
          )
          return
      self.port = port
      args = shlex.split(
          raw_command
          if raw_command
          else f"waitress-serve --listen=0.0.0.0:{port} {app_module}:{application_name}.server",
          posix=not self.is_windows,
      )
  
      logger.debug("start dash process with %s", args)
  
      try:
          self.proc = (
              subprocess.Popen(  # pylint: disable=consider-using-with
                  args, stdout=subprocess.PIPE, stderr=subprocess.PIPE
              )
          )
          # wait until server is able to answer http request
          wait.until(
              lambda: self.accessible(self.url), timeout=start_timeout
          )
  
      except (OSError, ValueError):
          logger.exception("process server has encountered an error")
          self.started = False
          self.stop()
          return
  
      self.started = True
  
imports: import sys
  import os
  import time
  import uuid
  import shlex
  import threading
  import shutil
  import subprocess
  import logging
  import inspect
  import ctypes
  import runpy
  import requests
  import psutil
  import multiprocess
  from dash.testing.errors import NoAppFoundError, TestingTimeoutError, ServerCloseError, DashAppLoadingError
  from dash.testing import wait
label_desc: Use image node_id 2 for calling the ProcessRunner obj's underlying member method code with example usage: obj.start(app_module, application_name, raw_command, port, start_timeout) without return types