mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
gh-104372: Drop the GIL around the vfork() call. (#104782)
On Linux where the `subprocess` module can use the `vfork` syscall for faster spawning, prevent the parent process from blocking other threads by dropping the GIL while it waits for the vfork'ed child process `exec` outcome. This prevents spawning a binary from a slow filesystem from blocking the rest of the application. Fixes #104372.
This commit is contained in:
parent
08888650aa
commit
d08679212d
3 changed files with 31 additions and 6 deletions
|
@ -57,10 +57,13 @@ underlying :class:`Popen` interface can be used directly.
|
|||
and combine both streams into one, use ``stdout=PIPE`` and ``stderr=STDOUT``
|
||||
instead of *capture_output*.
|
||||
|
||||
The *timeout* argument is passed to :meth:`Popen.communicate`. If the timeout
|
||||
expires, the child process will be killed and waited for. The
|
||||
:exc:`TimeoutExpired` exception will be re-raised after the child process
|
||||
has terminated.
|
||||
A *timeout* may be specified in seconds, it is internally passed on to
|
||||
:meth:`Popen.communicate`. If the timeout expires, the child process will be
|
||||
killed and waited for. The :exc:`TimeoutExpired` exception will be
|
||||
re-raised after the child process has terminated. The initial process
|
||||
creation itself cannot be interrupted on many platform APIs so you are not
|
||||
guaranteed to see a timeout exception until at least after however long
|
||||
process creation takes.
|
||||
|
||||
The *input* argument is passed to :meth:`Popen.communicate` and thus to the
|
||||
subprocess's stdin. If used it must be a byte sequence, or a string if
|
||||
|
@ -734,7 +737,7 @@ arguments.
|
|||
code.
|
||||
|
||||
All of the functions and methods that accept a *timeout* parameter, such as
|
||||
:func:`call` and :meth:`Popen.communicate` will raise :exc:`TimeoutExpired` if
|
||||
:func:`run` and :meth:`Popen.communicate` will raise :exc:`TimeoutExpired` if
|
||||
the timeout expires before the process exits.
|
||||
|
||||
Exceptions defined in this module all inherit from :exc:`SubprocessError`.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue