code: async def ensure_process(self):
          
          # We don't want multiple requests trying to start the process at the same time
          # FIXME: Make sure this times out properly?
          # Invariant here should be: when lock isn't being held, either 'proc' is in state &
          # running, or not.
          with (await self.state['proc_lock']):
              if 'proc' not in self.state:
                  # FIXME: Prevent races here
                  # FIXME: Handle graceful exits of spawned processes here
                  cmd = self.get_cmd()
                  server_env = os.environ.copy()
  
                  # Set up extra environment variables for process
                  server_env.update(self.get_env())
  
                  timeout = self.get_timeout()
  
                  proc = SupervisedProcess(self.name, *cmd, env=server_env, ready_func=self._http_ready_func, ready_timeout=timeout, log=self.log)
                  self.state['proc'] = proc
  
                  try:
                      await proc.start()
  
                      is_ready = await proc.ready()
  
                      if not is_ready:
                          await proc.kill()
                          raise web.HTTPError(500, 'could not start {} in time'.format(self.name))
                  except:
                      # Make sure we remove proc from state in any error condition
                      del self.state['proc']
                      raise
docs: Start the process