• Victor Stinner's avatar
    asyncio: sync with Tulip · 47cd10d7
    Victor Stinner authored
    Issue #23347: send_signal(), kill() and terminate() methods of
    BaseSubprocessTransport now check if the transport was closed and if the
    process exited.
    
    Issue #23347: Refactor creation of subprocess transports. Changes on
    BaseSubprocessTransport:
    
    * Add a wait() method to wait until the child process exit
    * The constructor now accepts an optional waiter parameter. The _post_init()
      coroutine must not be called explicitly anymore. It makes subprocess
      transports closer to other transports, and it gives more freedom if we want
      later to change completly how subprocess transports are created.
    * close() now kills the process instead of kindly terminate it: the child
      process may ignore SIGTERM and continue to run. Call explicitly terminate()
      and wait() if you want to kindly terminate the child process.
    * close() now logs a warning in debug mode if the process is still running and
      needs to be killed
    * _make_subprocess_transport() is now fully asynchronous again: if the creation
      of the transport failed, wait asynchronously for the process eixt. Before the
      wait was synchronous. This change requires close() to *kill*, and not
      terminate, the child process.
    * Remove the _kill_wait() method, replaced with a more agressive close()
      method. It fixes _make_subprocess_transport() on error.
      BaseSubprocessTransport.close() calls the close() method of pipe transports,
      whereas _kill_wait() closed directly pipes of the subprocess.Popen object
      without unregistering file descriptors from the selector (which caused severe
      bugs).
    
    These changes simplifies the code of subprocess.py.
    47cd10d7
base_subprocess.py 8.26 KB