annotate Lib/multiprocessing/process.py @ 87690:66c1c9f32567 default tip

Add use_weakref option to functools.lru_cache The use_weakref option makes lru_cache create weak references to the function arguments when creating the cache key, which prevents them from staying in the memory forever even after all other references to them are gone. This is a proof of concept for http://bugs.python.org/issue19859
author Radomir Dopieralski <devel@sheep.art.pl>
date Tue, 03 Dec 2013 16:02:48 +0100
parents 9779267262d2
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
1 #
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
2 # Module providing the `Process` class which emulates `threading.Thread`
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
3 #
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
4 # multiprocessing/process.py
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
5 #
66885
b084b50e4aa6 9162: fix license in multiprocessing files
R. David Murray <rdmurray@bitdance.com>
parents: 59332
diff changeset
6 # Copyright (c) 2006-2008, R Oudkerk
76663
25cc0c8fd4e2 Mark multiprocessing files with "Licensed to PSF under a Contributor Agreement"
Richard Oudkerk <shibturn@gmail.com>
parents: 74653
diff changeset
7 # Licensed to PSF under a Contributor Agreement.
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
8 #
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
9
86387
72a5ac909c7a Issue #18999: Make multiprocessing use context objects.
Richard Oudkerk <shibturn@gmail.com>
parents: 85169
diff changeset
10 __all__ = ['BaseProcess', 'current_process', 'active_children']
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
11
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
12 #
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
13 # Imports
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
14 #
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
15
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
16 import os
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
17 import sys
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
18 import signal
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
19 import itertools
71361
2bedea96de60 Issue #12573: Add resource checks for dangling Thread and Process objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 70831
diff changeset
20 from _weakrefset import WeakSet
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
21
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
22 #
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
23 #
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
24 #
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
25
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
26 try:
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
27 ORIGINAL_DIR = os.path.abspath(os.getcwd())
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
28 except OSError:
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
29 ORIGINAL_DIR = None
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
30
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
31 #
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
32 # Public functions
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
33 #
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
34
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
35 def current_process():
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
36 '''
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
37 Return process object representing the current process
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
38 '''
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
39 return _current_process
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
40
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
41 def active_children():
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
42 '''
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
43 Return list of process objects corresponding to live child processes
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
44 '''
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
45 _cleanup()
85169
3b82e0d83bf9 Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents: 77376
diff changeset
46 return list(_children)
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
47
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
48 #
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
49 #
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
50 #
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
51
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
52 def _cleanup():
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
53 # check for processes which have finished
85169
3b82e0d83bf9 Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents: 77376
diff changeset
54 for p in list(_children):
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
55 if p._popen.poll() is not None:
85169
3b82e0d83bf9 Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents: 77376
diff changeset
56 _children.discard(p)
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
57
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
58 #
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
59 # The `Process` class
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
60 #
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
61
86387
72a5ac909c7a Issue #18999: Make multiprocessing use context objects.
Richard Oudkerk <shibturn@gmail.com>
parents: 85169
diff changeset
62 class BaseProcess(object):
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
63 '''
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
64 Process objects represent activity that is run in a separate process
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
65
85169
3b82e0d83bf9 Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents: 77376
diff changeset
66 The class is analogous to `threading.Thread`
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
67 '''
86387
72a5ac909c7a Issue #18999: Make multiprocessing use context objects.
Richard Oudkerk <shibturn@gmail.com>
parents: 85169
diff changeset
68 def _Popen(self):
72a5ac909c7a Issue #18999: Make multiprocessing use context objects.
Richard Oudkerk <shibturn@gmail.com>
parents: 85169
diff changeset
69 raise NotImplementedError
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
70
68155
f71acc4b2341 Issue #6064: Add a `daemon` keyword argument to the threading.Thread
Antoine Pitrou <solipsis@pitrou.net>
parents: 66885
diff changeset
71 def __init__(self, group=None, target=None, name=None, args=(), kwargs={},
f71acc4b2341 Issue #6064: Add a `daemon` keyword argument to the threading.Thread
Antoine Pitrou <solipsis@pitrou.net>
parents: 66885
diff changeset
72 *, daemon=None):
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
73 assert group is None, 'group argument must be None for now'
85169
3b82e0d83bf9 Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents: 77376
diff changeset
74 count = next(_process_counter)
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
75 self._identity = _current_process._identity + (count,)
85169
3b82e0d83bf9 Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents: 77376
diff changeset
76 self._config = _current_process._config.copy()
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
77 self._parent_pid = os.getpid()
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
78 self._popen = None
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
79 self._target = target
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
80 self._args = tuple(args)
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
81 self._kwargs = dict(kwargs)
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
82 self._name = name or type(self).__name__ + '-' + \
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
83 ':'.join(str(i) for i in self._identity)
85169
3b82e0d83bf9 Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents: 77376
diff changeset
84 if daemon is not None:
3b82e0d83bf9 Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents: 77376
diff changeset
85 self.daemon = daemon
71361
2bedea96de60 Issue #12573: Add resource checks for dangling Thread and Process objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 70831
diff changeset
86 _dangling.add(self)
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
87
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
88 def run(self):
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
89 '''
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
90 Method to be run in sub-process; can be overridden in sub-class
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
91 '''
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
92 if self._target:
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
93 self._target(*self._args, **self._kwargs)
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
94
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
95 def start(self):
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
96 '''
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
97 Start child process
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
98 '''
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
99 assert self._popen is None, 'cannot start a process twice'
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
100 assert self._parent_pid == os.getpid(), \
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
101 'can only start a process object created by current process'
85169
3b82e0d83bf9 Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents: 77376
diff changeset
102 assert not _current_process._config.get('daemon'), \
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
103 'daemonic processes are not allowed to have children'
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
104 _cleanup()
86387
72a5ac909c7a Issue #18999: Make multiprocessing use context objects.
Richard Oudkerk <shibturn@gmail.com>
parents: 85169
diff changeset
105 self._popen = self._Popen(self)
70690
568a3ba088e4 Issue #12040: Expose a new attribute `sentinel` on instances of
Antoine Pitrou <solipsis@pitrou.net>
parents: 68155
diff changeset
106 self._sentinel = self._popen.sentinel
85169
3b82e0d83bf9 Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents: 77376
diff changeset
107 _children.add(self)
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
108
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
109 def terminate(self):
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
110 '''
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
111 Terminate process; sends SIGTERM signal or uses TerminateProcess()
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
112 '''
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
113 self._popen.terminate()
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
114
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
115 def join(self, timeout=None):
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
116 '''
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
117 Wait until child process terminates
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
118 '''
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
119 assert self._parent_pid == os.getpid(), 'can only join a child process'
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
120 assert self._popen is not None, 'can only join a started process'
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
121 res = self._popen.wait(timeout)
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
122 if res is not None:
85169
3b82e0d83bf9 Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents: 77376
diff changeset
123 _children.discard(self)
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
124
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
125 def is_alive(self):
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
126 '''
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
127 Return whether process is alive
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
128 '''
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
129 if self is _current_process:
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
130 return True
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
131 assert self._parent_pid == os.getpid(), 'can only test a child process'
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
132 if self._popen is None:
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
133 return False
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
134 self._popen.poll()
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
135 return self._popen.returncode is None
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
136
48773
25f06a703f89 Merged revisions 65864 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48366
diff changeset
137 @property
25f06a703f89 Merged revisions 65864 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48366
diff changeset
138 def name(self):
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
139 return self._name
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
140
48773
25f06a703f89 Merged revisions 65864 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48366
diff changeset
141 @name.setter
25f06a703f89 Merged revisions 65864 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48366
diff changeset
142 def name(self, name):
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
143 assert isinstance(name, str), 'name must be a string'
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
144 self._name = name
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
145
48773
25f06a703f89 Merged revisions 65864 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48366
diff changeset
146 @property
25f06a703f89 Merged revisions 65864 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48366
diff changeset
147 def daemon(self):
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
148 '''
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
149 Return whether process is a daemon
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
150 '''
85169
3b82e0d83bf9 Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents: 77376
diff changeset
151 return self._config.get('daemon', False)
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
152
48773
25f06a703f89 Merged revisions 65864 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48366
diff changeset
153 @daemon.setter
25f06a703f89 Merged revisions 65864 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48366
diff changeset
154 def daemon(self, daemonic):
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
155 '''
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
156 Set whether process is a daemon
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
157 '''
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
158 assert self._popen is None, 'process has already started'
85169
3b82e0d83bf9 Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents: 77376
diff changeset
159 self._config['daemon'] = daemonic
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
160
48773
25f06a703f89 Merged revisions 65864 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48366
diff changeset
161 @property
25f06a703f89 Merged revisions 65864 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48366
diff changeset
162 def authkey(self):
85169
3b82e0d83bf9 Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents: 77376
diff changeset
163 return self._config['authkey']
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
164
48773
25f06a703f89 Merged revisions 65864 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48366
diff changeset
165 @authkey.setter
25f06a703f89 Merged revisions 65864 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48366
diff changeset
166 def authkey(self, authkey):
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
167 '''
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
168 Set authorization key of process
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
169 '''
85169
3b82e0d83bf9 Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents: 77376
diff changeset
170 self._config['authkey'] = AuthenticationString(authkey)
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
171
48773
25f06a703f89 Merged revisions 65864 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48366
diff changeset
172 @property
25f06a703f89 Merged revisions 65864 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48366
diff changeset
173 def exitcode(self):
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
174 '''
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
175 Return exit code of process or `None` if it has yet to stop
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
176 '''
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
177 if self._popen is None:
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
178 return self._popen
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
179 return self._popen.poll()
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
180
48773
25f06a703f89 Merged revisions 65864 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48366
diff changeset
181 @property
25f06a703f89 Merged revisions 65864 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48366
diff changeset
182 def ident(self):
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
183 '''
59332
6facbc183a4a Missing part from r78654
Florent Xicluna <florent.xicluna@gmail.com>
parents: 55491
diff changeset
184 Return identifier (PID) of process or `None` if it has yet to start
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
185 '''
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
186 if self is _current_process:
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
187 return os.getpid()
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
188 else:
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
189 return self._popen and self._popen.pid
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
190
48773
25f06a703f89 Merged revisions 65864 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48366
diff changeset
191 pid = ident
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
192
70690
568a3ba088e4 Issue #12040: Expose a new attribute `sentinel` on instances of
Antoine Pitrou <solipsis@pitrou.net>
parents: 68155
diff changeset
193 @property
568a3ba088e4 Issue #12040: Expose a new attribute `sentinel` on instances of
Antoine Pitrou <solipsis@pitrou.net>
parents: 68155
diff changeset
194 def sentinel(self):
568a3ba088e4 Issue #12040: Expose a new attribute `sentinel` on instances of
Antoine Pitrou <solipsis@pitrou.net>
parents: 68155
diff changeset
195 '''
568a3ba088e4 Issue #12040: Expose a new attribute `sentinel` on instances of
Antoine Pitrou <solipsis@pitrou.net>
parents: 68155
diff changeset
196 Return a file descriptor (Unix) or handle (Windows) suitable for
568a3ba088e4 Issue #12040: Expose a new attribute `sentinel` on instances of
Antoine Pitrou <solipsis@pitrou.net>
parents: 68155
diff changeset
197 waiting for process termination.
568a3ba088e4 Issue #12040: Expose a new attribute `sentinel` on instances of
Antoine Pitrou <solipsis@pitrou.net>
parents: 68155
diff changeset
198 '''
568a3ba088e4 Issue #12040: Expose a new attribute `sentinel` on instances of
Antoine Pitrou <solipsis@pitrou.net>
parents: 68155
diff changeset
199 try:
568a3ba088e4 Issue #12040: Expose a new attribute `sentinel` on instances of
Antoine Pitrou <solipsis@pitrou.net>
parents: 68155
diff changeset
200 return self._sentinel
568a3ba088e4 Issue #12040: Expose a new attribute `sentinel` on instances of
Antoine Pitrou <solipsis@pitrou.net>
parents: 68155
diff changeset
201 except AttributeError:
568a3ba088e4 Issue #12040: Expose a new attribute `sentinel` on instances of
Antoine Pitrou <solipsis@pitrou.net>
parents: 68155
diff changeset
202 raise ValueError("process not started")
568a3ba088e4 Issue #12040: Expose a new attribute `sentinel` on instances of
Antoine Pitrou <solipsis@pitrou.net>
parents: 68155
diff changeset
203
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
204 def __repr__(self):
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
205 if self is _current_process:
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
206 status = 'started'
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
207 elif self._parent_pid != os.getpid():
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
208 status = 'unknown'
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
209 elif self._popen is None:
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
210 status = 'initial'
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
211 else:
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
212 if self._popen.poll() is not None:
48773
25f06a703f89 Merged revisions 65864 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48366
diff changeset
213 status = self.exitcode
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
214 else:
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
215 status = 'started'
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
216
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
217 if type(status) is int:
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
218 if status == 0:
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
219 status = 'stopped'
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
220 else:
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
221 status = 'stopped[%s]' % _exitcode_to_name.get(status, status)
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
222
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
223 return '<%s(%s, %s%s)>' % (type(self).__name__, self._name,
85169
3b82e0d83bf9 Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents: 77376
diff changeset
224 status, self.daemon and ' daemon' or '')
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
225
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
226 ##
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
227
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
228 def _bootstrap(self):
86387
72a5ac909c7a Issue #18999: Make multiprocessing use context objects.
Richard Oudkerk <shibturn@gmail.com>
parents: 85169
diff changeset
229 from . import util, context
85169
3b82e0d83bf9 Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents: 77376
diff changeset
230 global _current_process, _process_counter, _children
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
231
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
232 try:
86387
72a5ac909c7a Issue #18999: Make multiprocessing use context objects.
Richard Oudkerk <shibturn@gmail.com>
parents: 85169
diff changeset
233 if self._start_method is not None:
72a5ac909c7a Issue #18999: Make multiprocessing use context objects.
Richard Oudkerk <shibturn@gmail.com>
parents: 85169
diff changeset
234 context._force_start_method(self._start_method)
85169
3b82e0d83bf9 Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents: 77376
diff changeset
235 _process_counter = itertools.count(1)
3b82e0d83bf9 Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents: 77376
diff changeset
236 _children = set()
48793
6cc89c60f74d For some reason sys.stdin may be None on Windows, and makes test_multiprocessing fail.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48773
diff changeset
237 if sys.stdin is not None:
6cc89c60f74d For some reason sys.stdin may be None on Windows, and makes test_multiprocessing fail.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48773
diff changeset
238 try:
55491
60b31f0db016 Merged revisions 74063 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 48793
diff changeset
239 sys.stdin.close()
60b31f0db016 Merged revisions 74063 via svnmerge from
R. David Murray <rdmurray@bitdance.com>
parents: 48793
diff changeset
240 sys.stdin = open(os.devnull)
48793
6cc89c60f74d For some reason sys.stdin may be None on Windows, and makes test_multiprocessing fail.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48773
diff changeset
241 except (OSError, ValueError):
6cc89c60f74d For some reason sys.stdin may be None on Windows, and makes test_multiprocessing fail.
Amaury Forgeot d'Arc <amauryfa@gmail.com>
parents: 48773
diff changeset
242 pass
70831
e6e7e42efdc2 Issue #12310: finalize the old process after _run_after_forkers()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66885
diff changeset
243 old_process = _current_process
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
244 _current_process = self
70831
e6e7e42efdc2 Issue #12310: finalize the old process after _run_after_forkers()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66885
diff changeset
245 try:
e6e7e42efdc2 Issue #12310: finalize the old process after _run_after_forkers()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66885
diff changeset
246 util._finalizer_registry.clear()
e6e7e42efdc2 Issue #12310: finalize the old process after _run_after_forkers()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66885
diff changeset
247 util._run_after_forkers()
e6e7e42efdc2 Issue #12310: finalize the old process after _run_after_forkers()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66885
diff changeset
248 finally:
e6e7e42efdc2 Issue #12310: finalize the old process after _run_after_forkers()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66885
diff changeset
249 # delay finalization of the old process object until after
e6e7e42efdc2 Issue #12310: finalize the old process after _run_after_forkers()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66885
diff changeset
250 # _run_after_forkers() is executed
e6e7e42efdc2 Issue #12310: finalize the old process after _run_after_forkers()
Victor Stinner <victor.stinner@haypocalc.com>
parents: 66885
diff changeset
251 del old_process
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
252 util.info('child process calling self.run()')
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
253 try:
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
254 self.run()
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
255 exitcode = 0
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
256 finally:
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
257 util._exit_function()
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
258 except SystemExit as e:
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
259 if not e.args:
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
260 exitcode = 1
77375
4346cba353b4 Issue #13854: Properly handle non-integer, non-string arg to SystemExit
Richard Oudkerk <shibturn@gmail.com>
parents: 74652
diff changeset
261 elif isinstance(e.args[0], int):
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
262 exitcode = e.args[0]
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
263 else:
77375
4346cba353b4 Issue #13854: Properly handle non-integer, non-string arg to SystemExit
Richard Oudkerk <shibturn@gmail.com>
parents: 74652
diff changeset
264 sys.stderr.write(str(e.args[0]) + '\n')
87209
44b5ec2f0f5d Fix handling of SystemExit and exit code. Patch by Brodie Rao.
Richard Oudkerk <shibturn@gmail.com>
parents: 77376
diff changeset
265 exitcode = 1
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
266 except:
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
267 exitcode = 1
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
268 import traceback
48773
25f06a703f89 Merged revisions 65864 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents: 48366
diff changeset
269 sys.stderr.write('Process %s:\n' % self.name)
74652
2863d9273abd Issue #13812: When a multiprocessing Process child raises an exception, flush stderr after printing the exception traceback.
Antoine Pitrou <solipsis@pitrou.net>
parents: 71361
diff changeset
270 traceback.print_exc()
2863d9273abd Issue #13812: When a multiprocessing Process child raises an exception, flush stderr after printing the exception traceback.
Antoine Pitrou <solipsis@pitrou.net>
parents: 71361
diff changeset
271 finally:
2863d9273abd Issue #13812: When a multiprocessing Process child raises an exception, flush stderr after printing the exception traceback.
Antoine Pitrou <solipsis@pitrou.net>
parents: 71361
diff changeset
272 util.info('process exiting with exitcode %d' % exitcode)
2863d9273abd Issue #13812: When a multiprocessing Process child raises an exception, flush stderr after printing the exception traceback.
Antoine Pitrou <solipsis@pitrou.net>
parents: 71361
diff changeset
273 sys.stdout.flush()
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
274 sys.stderr.flush()
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
275
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
276 return exitcode
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
277
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
278 #
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
279 # We subclass bytes to avoid accidental transmission of auth keys over network
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
280 #
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
281
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
282 class AuthenticationString(bytes):
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
283 def __reduce__(self):
86387
72a5ac909c7a Issue #18999: Make multiprocessing use context objects.
Richard Oudkerk <shibturn@gmail.com>
parents: 85169
diff changeset
284 from .context import get_spawning_popen
85169
3b82e0d83bf9 Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents: 77376
diff changeset
285 if get_spawning_popen() is None:
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
286 raise TypeError(
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
287 'Pickling an AuthenticationString object is '
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
288 'disallowed for security reasons'
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
289 )
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
290 return AuthenticationString, (bytes(self),)
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
291
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
292 #
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
293 # Create object representing the main process
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
294 #
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
295
86387
72a5ac909c7a Issue #18999: Make multiprocessing use context objects.
Richard Oudkerk <shibturn@gmail.com>
parents: 85169
diff changeset
296 class _MainProcess(BaseProcess):
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
297
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
298 def __init__(self):
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
299 self._identity = ()
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
300 self._name = 'MainProcess'
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
301 self._parent_pid = None
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
302 self._popen = None
85169
3b82e0d83bf9 Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents: 77376
diff changeset
303 self._config = {'authkey': AuthenticationString(os.urandom(32)),
86864
1b5506fc6a50 Issue #19478: Make choice of semaphore prefix more flexible.
Richard Oudkerk <shibturn@gmail.com>
parents: 86387
diff changeset
304 'semprefix': '/mp'}
85169
3b82e0d83bf9 Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents: 77376
diff changeset
305 # Note that some versions of FreeBSD only allow named
86864
1b5506fc6a50 Issue #19478: Make choice of semaphore prefix more flexible.
Richard Oudkerk <shibturn@gmail.com>
parents: 86387
diff changeset
306 # semaphores to have names of up to 14 characters. Therefore
85169
3b82e0d83bf9 Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents: 77376
diff changeset
307 # we choose a short prefix.
86864
1b5506fc6a50 Issue #19478: Make choice of semaphore prefix more flexible.
Richard Oudkerk <shibturn@gmail.com>
parents: 86387
diff changeset
308 #
1b5506fc6a50 Issue #19478: Make choice of semaphore prefix more flexible.
Richard Oudkerk <shibturn@gmail.com>
parents: 86387
diff changeset
309 # On MacOSX in a sandbox it may be necessary to use a
1b5506fc6a50 Issue #19478: Make choice of semaphore prefix more flexible.
Richard Oudkerk <shibturn@gmail.com>
parents: 86387
diff changeset
310 # different prefix -- see #19478.
1b5506fc6a50 Issue #19478: Make choice of semaphore prefix more flexible.
Richard Oudkerk <shibturn@gmail.com>
parents: 86387
diff changeset
311 #
1b5506fc6a50 Issue #19478: Make choice of semaphore prefix more flexible.
Richard Oudkerk <shibturn@gmail.com>
parents: 86387
diff changeset
312 # Everything in self._config will be inherited by descendant
1b5506fc6a50 Issue #19478: Make choice of semaphore prefix more flexible.
Richard Oudkerk <shibturn@gmail.com>
parents: 86387
diff changeset
313 # processes.
85169
3b82e0d83bf9 Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents: 77376
diff changeset
314
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
315
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
316 _current_process = _MainProcess()
85169
3b82e0d83bf9 Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents: 77376
diff changeset
317 _process_counter = itertools.count(1)
3b82e0d83bf9 Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents: 77376
diff changeset
318 _children = set()
47595
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
319 del _MainProcess
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
320
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
321 #
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
322 # Give names to some return codes
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
323 #
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
324
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
325 _exitcode_to_name = {}
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
326
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
327 for name, signum in list(signal.__dict__.items()):
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
328 if name[:3]=='SIG' and '_' not in name:
5c6cdfcd6eae Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff changeset
329 _exitcode_to_name[-signum] = name
71361
2bedea96de60 Issue #12573: Add resource checks for dangling Thread and Process objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 70831
diff changeset
330
2bedea96de60 Issue #12573: Add resource checks for dangling Thread and Process objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 70831
diff changeset
331 # For debug and leak testing
2bedea96de60 Issue #12573: Add resource checks for dangling Thread and Process objects.
Antoine Pitrou <solipsis@pitrou.net>
parents: 70831
diff changeset
332 _dangling = WeakSet()