code: def _launch(self, process_obj):
      prep_data = spawn.get_preparation_data(process_obj._name)
      buf = io.BytesIO()
      set_spawning_popen(self)
      try:
          reduction.dump(prep_data, buf)
          reduction.dump(process_obj, buf)
      finally:
          set_spawning_popen(None)
  
      self.sentinel, w = forkserver.connect_to_new_process(self._fds)
      # Keep a duplicate of the data pipe's write end as a sentinel of the
      # parent process used by the child process.
      _parent_w = os.dup(w)
      self.finalizer = util.Finalize(
          self, util.close_fds, (_parent_w, self.sentinel)
      )
      with open(w, "wb", closefd=True) as f:
          f.write(buf.getbuffer())
      self.pid = forkserver.read_signed(self.sentinel)
  
file_path: cpython/Lib/multiprocessing/popen_forkserver.py
imports: import io
  import os
  from .context import reduction, set_spawning_popen
  from .None import forkserver
  from .None import popen_fork
  from .None import spawn
  from .None import util
label_desc: Use image node_id 3 for calling the Popen obj's underlying member method code with example usage: obj._launch(process_obj) without return types