diff options
author | Victor Stinner <vstinner@redhat.com> | 2018-12-14 11:58:52 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-12-14 11:58:52 (GMT) |
commit | 7acd50ad8b2a4fe132f7b26980ed3cd209b7ea12 (patch) | |
tree | 2a08755864f9da7648ba66f58ecebd081f966f98 | |
parent | cb0f5e29e37c081e9bba91a9858370e2504e9e8e (diff) | |
download | cpython-7acd50ad8b2a4fe132f7b26980ed3cd209b7ea12.zip cpython-7acd50ad8b2a4fe132f7b26980ed3cd209b7ea12.tar.gz cpython-7acd50ad8b2a4fe132f7b26980ed3cd209b7ea12.tar.bz2 |
bpo-35491: Enhance multiprocessing.BaseProcess.__repr__() (GH-11138)
* Add the pid and parent pid to multiprocessing.BaseProcess.__repr__().
* Add negative sign (ex: "-SIGTERM") to exitcode (process killed
by a signal)
* Only call _popen.poll() once.
Example:
<ForkProcess(ForkPoolWorker-1, started daemon)>
becomes:
<ForkProcess name='ForkPoolWorker-1' pid=12449 parent=12448 started daemon>
Example:
<ForkProcess(ForkPoolWorker-1, stopped[SIGTERM] daemon)>
becomes:
<ForkProcess name='ForkPoolWorker-1' pid=12960 parent=12959 stopped exitcode=-SIGTERM daemon>
-rw-r--r-- | Doc/library/multiprocessing.rst | 6 | ||||
-rw-r--r-- | Lib/multiprocessing/process.py | 27 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2018-12-14-12-12-15.bpo-35491.jHsNOU.rst | 4 |
3 files changed, 23 insertions, 14 deletions
diff --git a/Doc/library/multiprocessing.rst b/Doc/library/multiprocessing.rst index 578b548..1d0920a 100644 --- a/Doc/library/multiprocessing.rst +++ b/Doc/library/multiprocessing.rst @@ -626,14 +626,14 @@ The :mod:`multiprocessing` package mostly replicates the API of the >>> import multiprocessing, time, signal >>> p = multiprocessing.Process(target=time.sleep, args=(1000,)) >>> print(p, p.is_alive()) - <Process(..., initial)> False + <Process ... initial> False >>> p.start() >>> print(p, p.is_alive()) - <Process(..., started)> True + <Process ... started> True >>> p.terminate() >>> time.sleep(0.1) >>> print(p, p.is_alive()) - <Process(..., stopped[SIGTERM])> False + <Process ... stopped exitcode=-SIGTERM> False >>> p.exitcode == -signal.SIGTERM True diff --git a/Lib/multiprocessing/process.py b/Lib/multiprocessing/process.py index cd592d0..780f2d0 100644 --- a/Lib/multiprocessing/process.py +++ b/Lib/multiprocessing/process.py @@ -248,6 +248,7 @@ class BaseProcess(object): raise ValueError("process not started") from None def __repr__(self): + exitcode = None if self is _current_process: status = 'started' elif self._closed: @@ -257,19 +258,23 @@ class BaseProcess(object): elif self._popen is None: status = 'initial' else: - if self._popen.poll() is not None: - status = self.exitcode - else: - status = 'started' - - if type(status) is int: - if status == 0: + exitcode = self._popen.poll() + if exitcode is not None: status = 'stopped' else: - status = 'stopped[%s]' % _exitcode_to_name.get(status, status) + status = 'started' - return '<%s(%s, %s%s)>' % (type(self).__name__, self._name, - status, self.daemon and ' daemon' or '') + info = [type(self).__name__, 'name=%r' % self._name] + if self._popen is not None: + info.append('pid=%s' % self._popen.pid) + info.append('parent=%s' % self._parent_pid) + info.append(status) + if exitcode is not None: + exitcode = _exitcode_to_name.get(exitcode, exitcode) + info.append('exitcode=%s' % exitcode) + if self.daemon: + info.append('daemon') + return '<%s>' % ' '.join(info) ## @@ -373,7 +378,7 @@ _exitcode_to_name = {} for name, signum in list(signal.__dict__.items()): if name[:3]=='SIG' and '_' not in name: - _exitcode_to_name[-signum] = name + _exitcode_to_name[-signum] = f'-{name}' # For debug and leak testing _dangling = WeakSet() diff --git a/Misc/NEWS.d/next/Library/2018-12-14-12-12-15.bpo-35491.jHsNOU.rst b/Misc/NEWS.d/next/Library/2018-12-14-12-12-15.bpo-35491.jHsNOU.rst new file mode 100644 index 0000000..7bb650a --- /dev/null +++ b/Misc/NEWS.d/next/Library/2018-12-14-12-12-15.bpo-35491.jHsNOU.rst @@ -0,0 +1,4 @@ +:mod:`multiprocessing`: Add ``Pool.__repr__()`` and enhance +``BaseProcess.__repr__()`` (add pid and parent pid) to ease debugging. Pool +state constant values are now strings instead of integers, for example ``RUN`` +value becomes ``'RUN'`` instead of ``0``. |