Mercurial > cpython-lru_cache-weakref
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 |
| 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() |
