summaryrefslogtreecommitdiff
path: root/Lib/multiprocessing
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@redhat.com>2018-12-14 12:58:52 +0100
committerGitHub <noreply@github.com>2018-12-14 12:58:52 +0100
commit7acd50ad8b2a4fe132f7b26980ed3cd209b7ea12 (patch)
tree2a08755864f9da7648ba66f58ecebd081f966f98 /Lib/multiprocessing
parentcb0f5e29e37c081e9bba91a9858370e2504e9e8e (diff)
downloadcpython-git-7acd50ad8b2a4fe132f7b26980ed3cd209b7ea12.tar.gz
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>
Diffstat (limited to 'Lib/multiprocessing')
-rw-r--r--Lib/multiprocessing/process.py27
1 files changed, 16 insertions, 11 deletions
diff --git a/Lib/multiprocessing/process.py b/Lib/multiprocessing/process.py
index cd592d0bdf..780f2d0c27 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()