]> granicus.if.org Git - python/commitdiff
bpo-35491: Enhance multiprocessing.BaseProcess.__repr__() (GH-11138)
authorVictor Stinner <vstinner@redhat.com>
Fri, 14 Dec 2018 11:58:52 +0000 (12:58 +0100)
committerGitHub <noreply@github.com>
Fri, 14 Dec 2018 11:58:52 +0000 (12:58 +0100)
* 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>

Doc/library/multiprocessing.rst
Lib/multiprocessing/process.py
Misc/NEWS.d/next/Library/2018-12-14-12-12-15.bpo-35491.jHsNOU.rst [new file with mode: 0644]

index 578b5483286af09f1d0a81fbad2672a17b9a1695..1d0920aa608b38e59eb27ca7158ea83c0bb237aa 100644 (file)
@@ -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
 
index cd592d0bdf0910aa51beb6ae3e79d7dbd67e8349..780f2d0c273472cf0a14eee0d58c530da92b5175 100644 (file)
@@ -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 (file)
index 0000000..7bb650a
--- /dev/null
@@ -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``.