code: def launch(
      program: lp_program.Program,
      *,
      serialize_py_nodes: Optional[bool] = None,
  ):
      """Launches a program using multiple threads."""
      if serialize_py_nodes is None:
          serialize_py_nodes = False
  
      # Set up the launch context (launch type & launch config) for all nodes
      for label, nodes in program.groups.items():
          if serialize_py_nodes:
              serialization.check_nodes_are_serializable(label, nodes)
  
          for node in nodes:
              node._initialize_context(
                  context.LaunchType.LOCAL_MULTI_THREADING,
                  launch_config=None,
              )
  
      # Notify the input handles
      for label, nodes in program.groups.items():
          for node in nodes:
              for handle in node.input_handles:
                  handle.connect(node, label)
  
      # Setup addressing
      for node in program.get_all_nodes():
          node.bind_addresses()
  
      return thread_handler(program)
  
file_path: launchpad/launchpad/launch/local_multi_threading/launch.py
imports: import atexit
  from concurrent import futures
  import sys
  import threading
  from typing import Optional
  from absl import flags
  from launchpad import context
  from launchpad import flags
  from launchpad import program
  from launchpad.launch import serialization
  from launchpad.launch import worker_manager
  from launchpad.launch import worker_manager_v2
label_desc: Use image node_id 1 for calling a global function with example usage: launch(program) and returns: thread_handler