Mercurial > cpython-lru_cache-weakref
annotate Lib/multiprocessing/util.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 | 3e397ecedc55 |
| 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 various facilities to other parts of the package |
|
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/util.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:
51024
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:
73513
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 |
|
77035
347735ec92eb
#12098: Make multiprocessing's child processes inherit sys.flags on Windows
Richard Oudkerk <shibturn@gmail.com>
parents:
76863
diff
changeset
|
10 import sys |
|
70690
568a3ba088e4
Issue #12040: Expose a new attribute `sentinel` on instances of
Antoine Pitrou <solipsis@pitrou.net>
parents:
66885
diff
changeset
|
11 import functools |
|
77141
59567c117b0e
Issue #14548: Make multiprocessing finalizers check pid before running
Richard Oudkerk <shibturn@gmail.com>
parents:
77037
diff
changeset
|
12 import os |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
13 import itertools |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
14 import weakref |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
15 import atexit |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
16 import threading # we want threading to install it's |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
17 # cleanup function before multiprocessing does |
|
77036
2034b3de1144
Move private function _args_from_interpreter_flags() to subprocess.py, so
Antoine Pitrou <solipsis@pitrou.net>
parents:
77035
diff
changeset
|
18 from subprocess import _args_from_interpreter_flags |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
19 |
|
85169
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
20 from . import process |
|
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 __all__ = [ |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
23 'sub_debug', 'debug', 'info', 'sub_warning', 'get_logger', |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
24 'log_to_stderr', 'get_temp_dir', 'register_after_fork', |
| 51024 | 25 'is_exiting', 'Finalize', 'ForkAwareThreadLock', 'ForkAwareLocal', |
|
85169
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
26 'close_all_fds_except', 'SUBDEBUG', 'SUBWARNING', |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
27 ] |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
28 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
29 # |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
30 # Logging |
|
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 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
33 NOTSET = 0 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
34 SUBDEBUG = 5 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
35 DEBUG = 10 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
36 INFO = 20 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
37 SUBWARNING = 25 |
|
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 LOGGER_NAME = 'multiprocessing' |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
40 DEFAULT_LOGGING_FORMAT = '[%(levelname)s/%(processName)s] %(message)s' |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
41 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
42 _logger = None |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
43 _log_to_stderr = False |
|
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 def sub_debug(msg, *args): |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
46 if _logger: |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
47 _logger.log(SUBDEBUG, msg, *args) |
|
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 def debug(msg, *args): |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
50 if _logger: |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
51 _logger.log(DEBUG, msg, *args) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
52 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
53 def info(msg, *args): |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
54 if _logger: |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
55 _logger.log(INFO, msg, *args) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
56 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
57 def sub_warning(msg, *args): |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
58 if _logger: |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
59 _logger.log(SUBWARNING, msg, *args) |
|
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 def get_logger(): |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
62 ''' |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
63 Returns logger used by multiprocessing |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
64 ''' |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
65 global _logger |
|
73513
60fd58a56f44
Remove unused or redundant imports in concurrent.futures and multiprocessing.
Florent Xicluna <florent.xicluna@gmail.com>
parents:
73085
diff
changeset
|
66 import logging |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
67 |
| 51024 | 68 logging._acquireLock() |
| 69 try: | |
| 70 if not _logger: | |
| 71 | |
| 72 _logger = logging.getLogger(LOGGER_NAME) | |
| 73 _logger.propagate = 0 | |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
74 |
| 51024 | 75 # XXX multiprocessing should cleanup before logging |
| 76 if hasattr(atexit, 'unregister'): | |
| 77 atexit.unregister(_exit_function) | |
| 78 atexit.register(_exit_function) | |
| 79 else: | |
| 80 atexit._exithandlers.remove((_exit_function, (), {})) | |
| 81 atexit._exithandlers.append((_exit_function, (), {})) | |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
82 |
| 51024 | 83 finally: |
| 84 logging._releaseLock() | |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
85 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
86 return _logger |
|
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 log_to_stderr(level=None): |
|
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 Turn on logging and add a handler which prints to stderr |
|
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 global _log_to_stderr |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
93 import logging |
| 51024 | 94 |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
95 logger = get_logger() |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
96 formatter = logging.Formatter(DEFAULT_LOGGING_FORMAT) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
97 handler = logging.StreamHandler() |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
98 handler.setFormatter(formatter) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
99 logger.addHandler(handler) |
| 51024 | 100 |
| 101 if level: | |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
102 logger.setLevel(level) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
103 _log_to_stderr = True |
| 51024 | 104 return _logger |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
105 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
106 # |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
107 # Function returning a temp directory which will be removed on exit |
|
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 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
110 def get_temp_dir(): |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
111 # get name of a temp directory which will be automatically cleaned up |
|
85169
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
112 tempdir = process.current_process()._config.get('tempdir') |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
113 if tempdir is None: |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
114 import shutil, tempfile |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
115 tempdir = tempfile.mkdtemp(prefix='pymp-') |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
116 info('created temp directory %s', tempdir) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
117 Finalize(None, shutil.rmtree, args=[tempdir], exitpriority=-100) |
|
85169
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
118 process.current_process()._config['tempdir'] = tempdir |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
119 return tempdir |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
120 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
121 # |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
122 # Support for reinitialization of objects when bootstrapping a child process |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
123 # |
|
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 _afterfork_registry = weakref.WeakValueDictionary() |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
126 _afterfork_counter = itertools.count() |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
127 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
128 def _run_after_forkers(): |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
129 items = list(_afterfork_registry.items()) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
130 items.sort() |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
131 for (index, ident, func), obj in items: |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
132 try: |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
133 func(obj) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
134 except Exception as e: |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
135 info('after forker raised exception %s', e) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
136 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
137 def register_after_fork(obj, func): |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
138 _afterfork_registry[(next(_afterfork_counter), id(obj), func)] = obj |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
139 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
140 # |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
141 # Finalization using weakrefs |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
142 # |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
143 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
144 _finalizer_registry = {} |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
145 _finalizer_counter = itertools.count() |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
146 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
147 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
148 class Finalize(object): |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
149 ''' |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
150 Class which supports object finalization using weakrefs |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
151 ''' |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
152 def __init__(self, obj, callback, args=(), kwargs=None, exitpriority=None): |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
153 assert exitpriority is None or type(exitpriority) is int |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
154 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
155 if obj is not None: |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
156 self._weakref = weakref.ref(obj, self) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
157 else: |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
158 assert exitpriority is not None |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
159 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
160 self._callback = callback |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
161 self._args = args |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
162 self._kwargs = kwargs or {} |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
163 self._key = (exitpriority, next(_finalizer_counter)) |
|
77141
59567c117b0e
Issue #14548: Make multiprocessing finalizers check pid before running
Richard Oudkerk <shibturn@gmail.com>
parents:
77037
diff
changeset
|
164 self._pid = os.getpid() |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
165 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
166 _finalizer_registry[self._key] = self |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
167 |
|
71267
27224f7ef000
Rebind locally the globals which can be looked up at shutdown
Antoine Pitrou <solipsis@pitrou.net>
parents:
70691
diff
changeset
|
168 def __call__(self, wr=None, |
|
27224f7ef000
Rebind locally the globals which can be looked up at shutdown
Antoine Pitrou <solipsis@pitrou.net>
parents:
70691
diff
changeset
|
169 # Need to bind these locally because the globals can have |
|
27224f7ef000
Rebind locally the globals which can be looked up at shutdown
Antoine Pitrou <solipsis@pitrou.net>
parents:
70691
diff
changeset
|
170 # been cleared at shutdown |
|
27224f7ef000
Rebind locally the globals which can be looked up at shutdown
Antoine Pitrou <solipsis@pitrou.net>
parents:
70691
diff
changeset
|
171 _finalizer_registry=_finalizer_registry, |
|
77347
9257ea91df3d
Make Finalize reserve a reference to os.getpid in case called at shutdown
Richard Oudkerk <shibturn@gmail.com>
parents:
77141
diff
changeset
|
172 sub_debug=sub_debug, getpid=os.getpid): |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
173 ''' |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
174 Run the callback unless it has already been called or cancelled |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
175 ''' |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
176 try: |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
177 del _finalizer_registry[self._key] |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
178 except KeyError: |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
179 sub_debug('finalizer no longer registered') |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
180 else: |
|
77347
9257ea91df3d
Make Finalize reserve a reference to os.getpid in case called at shutdown
Richard Oudkerk <shibturn@gmail.com>
parents:
77141
diff
changeset
|
181 if self._pid != getpid(): |
|
77141
59567c117b0e
Issue #14548: Make multiprocessing finalizers check pid before running
Richard Oudkerk <shibturn@gmail.com>
parents:
77037
diff
changeset
|
182 sub_debug('finalizer ignored because different process') |
|
59567c117b0e
Issue #14548: Make multiprocessing finalizers check pid before running
Richard Oudkerk <shibturn@gmail.com>
parents:
77037
diff
changeset
|
183 res = None |
|
59567c117b0e
Issue #14548: Make multiprocessing finalizers check pid before running
Richard Oudkerk <shibturn@gmail.com>
parents:
77037
diff
changeset
|
184 else: |
|
59567c117b0e
Issue #14548: Make multiprocessing finalizers check pid before running
Richard Oudkerk <shibturn@gmail.com>
parents:
77037
diff
changeset
|
185 sub_debug('finalizer calling %s with args %s and kwargs %s', |
|
59567c117b0e
Issue #14548: Make multiprocessing finalizers check pid before running
Richard Oudkerk <shibturn@gmail.com>
parents:
77037
diff
changeset
|
186 self._callback, self._args, self._kwargs) |
|
59567c117b0e
Issue #14548: Make multiprocessing finalizers check pid before running
Richard Oudkerk <shibturn@gmail.com>
parents:
77037
diff
changeset
|
187 res = self._callback(*self._args, **self._kwargs) |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
188 self._weakref = self._callback = self._args = \ |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
189 self._kwargs = self._key = None |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
190 return res |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
191 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
192 def cancel(self): |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
193 ''' |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
194 Cancel finalization of the object |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
195 ''' |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
196 try: |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
197 del _finalizer_registry[self._key] |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
198 except KeyError: |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
199 pass |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
200 else: |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
201 self._weakref = self._callback = self._args = \ |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
202 self._kwargs = self._key = None |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
203 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
204 def still_active(self): |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
205 ''' |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
206 Return whether this finalizer is still waiting to invoke callback |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
207 ''' |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
208 return self._key in _finalizer_registry |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
209 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
210 def __repr__(self): |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
211 try: |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
212 obj = self._weakref() |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
213 except (AttributeError, TypeError): |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
214 obj = None |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
215 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
216 if obj is None: |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
217 return '<Finalize object, dead>' |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
218 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
219 x = '<Finalize object, callback=%s' % \ |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
220 getattr(self._callback, '__name__', self._callback) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
221 if self._args: |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
222 x += ', args=' + str(self._args) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
223 if self._kwargs: |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
224 x += ', kwargs=' + str(self._kwargs) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
225 if self._key[0] is not None: |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
226 x += ', exitprority=' + str(self._key[0]) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
227 return x + '>' |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
228 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
229 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
230 def _run_finalizers(minpriority=None): |
|
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 Run all finalizers whose exit priority is not None and at least minpriority |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
233 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
234 Finalizers with highest priority are called first; finalizers with |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
235 the same priority will be called in reverse order of creation. |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
236 ''' |
|
78922
27d410dd5431
Issue #15881: Fixed atexit hook in multiprocessing.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66885
diff
changeset
|
237 if _finalizer_registry is None: |
|
27d410dd5431
Issue #15881: Fixed atexit hook in multiprocessing.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66885
diff
changeset
|
238 # This function may be called after this module's globals are |
|
27d410dd5431
Issue #15881: Fixed atexit hook in multiprocessing.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66885
diff
changeset
|
239 # destroyed. See the _exit_function function in this module for more |
|
27d410dd5431
Issue #15881: Fixed atexit hook in multiprocessing.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66885
diff
changeset
|
240 # notes. |
|
27d410dd5431
Issue #15881: Fixed atexit hook in multiprocessing.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66885
diff
changeset
|
241 return |
|
78924
89a5169f2979
Fixed whitespace
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
78922
diff
changeset
|
242 |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
243 if minpriority is None: |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
244 f = lambda p : p[0][0] is not None |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
245 else: |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
246 f = lambda p : p[0][0] is not None and p[0][0] >= minpriority |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
247 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
248 items = [x for x in list(_finalizer_registry.items()) if f(x)] |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
249 items.sort(reverse=True) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
250 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
251 for key, finalizer in items: |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
252 sub_debug('calling %s', finalizer) |
|
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 finalizer() |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
255 except Exception: |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
256 import traceback |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
257 traceback.print_exc() |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
258 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
259 if minpriority is None: |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
260 _finalizer_registry.clear() |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
261 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
262 # |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
263 # Clean up on exit |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
264 # |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
265 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
266 def is_exiting(): |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
267 ''' |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
268 Returns true if the process is shutting down |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
269 ''' |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
270 return _exiting or _exiting is None |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
271 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
272 _exiting = False |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
273 |
|
78922
27d410dd5431
Issue #15881: Fixed atexit hook in multiprocessing.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66885
diff
changeset
|
274 def _exit_function(info=info, debug=debug, _run_finalizers=_run_finalizers, |
|
85169
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
275 active_children=process.active_children, |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
276 current_process=process.current_process): |
|
78922
27d410dd5431
Issue #15881: Fixed atexit hook in multiprocessing.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66885
diff
changeset
|
277 # We hold on to references to functions in the arglist due to the |
|
27d410dd5431
Issue #15881: Fixed atexit hook in multiprocessing.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66885
diff
changeset
|
278 # situation described below, where this function is called after this |
|
27d410dd5431
Issue #15881: Fixed atexit hook in multiprocessing.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66885
diff
changeset
|
279 # module's globals are destroyed. |
|
27d410dd5431
Issue #15881: Fixed atexit hook in multiprocessing.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66885
diff
changeset
|
280 |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
281 global _exiting |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
282 |
|
78922
27d410dd5431
Issue #15881: Fixed atexit hook in multiprocessing.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66885
diff
changeset
|
283 if not _exiting: |
|
78926
db67b848ddc3
Issue #15881: Fixed 3.2 backport.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
78924
diff
changeset
|
284 _exiting = True |
|
db67b848ddc3
Issue #15881: Fixed 3.2 backport.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
78924
diff
changeset
|
285 |
|
78922
27d410dd5431
Issue #15881: Fixed atexit hook in multiprocessing.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66885
diff
changeset
|
286 info('process shutting down') |
|
27d410dd5431
Issue #15881: Fixed atexit hook in multiprocessing.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66885
diff
changeset
|
287 debug('running all "atexit" finalizers with priority >= 0') |
|
27d410dd5431
Issue #15881: Fixed atexit hook in multiprocessing.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66885
diff
changeset
|
288 _run_finalizers(0) |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
289 |
|
78922
27d410dd5431
Issue #15881: Fixed atexit hook in multiprocessing.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66885
diff
changeset
|
290 if current_process() is not None: |
|
27d410dd5431
Issue #15881: Fixed atexit hook in multiprocessing.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66885
diff
changeset
|
291 # We check if the current process is None here because if |
|
80929
15a391919deb
Issue #16714: use 'raise' exceptions, don't 'throw'.
Andrew Svetlov <andrew.svetlov@gmail.com>
diff
changeset
|
292 # it's None, any call to ``active_children()`` will raise |
|
79019
2b79b4848f44
Issue #15881: Clarify comment in exit function
Richard Oudkerk <shibturn@gmail.com>
parents:
78928
diff
changeset
|
293 # an AttributeError (active_children winds up trying to |
|
2b79b4848f44
Issue #15881: Clarify comment in exit function
Richard Oudkerk <shibturn@gmail.com>
parents:
78928
diff
changeset
|
294 # get attributes from util._current_process). One |
|
2b79b4848f44
Issue #15881: Clarify comment in exit function
Richard Oudkerk <shibturn@gmail.com>
parents:
78928
diff
changeset
|
295 # situation where this can happen is if someone has |
|
2b79b4848f44
Issue #15881: Clarify comment in exit function
Richard Oudkerk <shibturn@gmail.com>
parents:
78928
diff
changeset
|
296 # manipulated sys.modules, causing this module to be |
|
2b79b4848f44
Issue #15881: Clarify comment in exit function
Richard Oudkerk <shibturn@gmail.com>
parents:
78928
diff
changeset
|
297 # garbage collected. The destructor for the module type |
|
2b79b4848f44
Issue #15881: Clarify comment in exit function
Richard Oudkerk <shibturn@gmail.com>
parents:
78928
diff
changeset
|
298 # then replaces all values in the module dict with None. |
|
2b79b4848f44
Issue #15881: Clarify comment in exit function
Richard Oudkerk <shibturn@gmail.com>
parents:
78928
diff
changeset
|
299 # For instance, after setuptools runs a test it replaces |
|
2b79b4848f44
Issue #15881: Clarify comment in exit function
Richard Oudkerk <shibturn@gmail.com>
parents:
78928
diff
changeset
|
300 # sys.modules with a copy created earlier. See issues |
|
2b79b4848f44
Issue #15881: Clarify comment in exit function
Richard Oudkerk <shibturn@gmail.com>
parents:
78928
diff
changeset
|
301 # #9775 and #15881. Also related: #4106, #9205, and |
|
2b79b4848f44
Issue #15881: Clarify comment in exit function
Richard Oudkerk <shibturn@gmail.com>
parents:
78928
diff
changeset
|
302 # #9207. |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
303 |
|
78922
27d410dd5431
Issue #15881: Fixed atexit hook in multiprocessing.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66885
diff
changeset
|
304 for p in active_children(): |
|
85169
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
305 if p.daemon: |
|
78922
27d410dd5431
Issue #15881: Fixed atexit hook in multiprocessing.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66885
diff
changeset
|
306 info('calling terminate() for daemon %s', p.name) |
|
27d410dd5431
Issue #15881: Fixed atexit hook in multiprocessing.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66885
diff
changeset
|
307 p._popen.terminate() |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
308 |
|
78922
27d410dd5431
Issue #15881: Fixed atexit hook in multiprocessing.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66885
diff
changeset
|
309 for p in active_children(): |
|
27d410dd5431
Issue #15881: Fixed atexit hook in multiprocessing.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66885
diff
changeset
|
310 info('calling join() for process %s', p.name) |
|
27d410dd5431
Issue #15881: Fixed atexit hook in multiprocessing.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66885
diff
changeset
|
311 p.join() |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
312 |
|
78922
27d410dd5431
Issue #15881: Fixed atexit hook in multiprocessing.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66885
diff
changeset
|
313 debug('running the remaining "atexit" finalizers') |
|
27d410dd5431
Issue #15881: Fixed atexit hook in multiprocessing.
Alexander Belopolsky <alexander.belopolsky@gmail.com>
parents:
66885
diff
changeset
|
314 _run_finalizers() |
|
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 atexit.register(_exit_function) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
317 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
318 # |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
319 # Some fork aware types |
|
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 class ForkAwareThreadLock(object): |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
323 def __init__(self): |
|
83428
21314f27a40c
Issue #17555: Fix ForkAwareThreadLock so that size of after fork
Richard Oudkerk <shibturn@gmail.com>
parents:
80929
diff
changeset
|
324 self._reset() |
|
21314f27a40c
Issue #17555: Fix ForkAwareThreadLock so that size of after fork
Richard Oudkerk <shibturn@gmail.com>
parents:
80929
diff
changeset
|
325 register_after_fork(self, ForkAwareThreadLock._reset) |
|
21314f27a40c
Issue #17555: Fix ForkAwareThreadLock so that size of after fork
Richard Oudkerk <shibturn@gmail.com>
parents:
80929
diff
changeset
|
326 |
|
21314f27a40c
Issue #17555: Fix ForkAwareThreadLock so that size of after fork
Richard Oudkerk <shibturn@gmail.com>
parents:
80929
diff
changeset
|
327 def _reset(self): |
|
47595
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
328 self._lock = threading.Lock() |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
329 self.acquire = self._lock.acquire |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
330 self.release = self._lock.release |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
331 |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
332 class ForkAwareLocal(threading.local): |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
333 def __init__(self): |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
334 register_after_fork(self, lambda obj : obj.__dict__.clear()) |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
335 def __reduce__(self): |
|
5c6cdfcd6eae
Merged revisions 64104,64117 via svnmerge from
Benjamin Peterson <benjamin@python.org>
parents:
diff
changeset
|
336 return type(self), () |
|
85169
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
337 |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
338 # |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
339 # Close fds except those specified |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
340 # |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
341 |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
342 try: |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
343 MAXFD = os.sysconf("SC_OPEN_MAX") |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
344 except Exception: |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
345 MAXFD = 256 |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
346 |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
347 def close_all_fds_except(fds): |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
348 fds = list(fds) + [-1, MAXFD] |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
349 fds.sort() |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
350 assert fds[-1] == MAXFD, 'fd too large' |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
351 for i in range(len(fds) - 1): |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
352 os.closerange(fds[i]+1, fds[i+1]) |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
353 |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
354 # |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
355 # Start a program with only specified fds kept open |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
356 # |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
357 |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
358 def spawnv_passfds(path, args, passfds): |
|
85429
3e397ecedc55
Issue #18865: remove unused import from multiprocessing.util.spawnv_passfds()
Victor Stinner <vstinner@wyplay.com>
parents:
85427
diff
changeset
|
359 import _posixsubprocess |
|
85169
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
360 passfds = sorted(passfds) |
|
85420
ef889c3d5dc6
Issue #18571: Implementation of the PEP 446: file descriptors and file handles
Victor Stinner <victor.stinner@gmail.com>
parents:
85169
diff
changeset
|
361 errpipe_read, errpipe_write = os.pipe() |
|
85169
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
362 try: |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
363 return _posixsubprocess.fork_exec( |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
364 args, [os.fsencode(path)], True, passfds, None, None, |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
365 -1, -1, -1, -1, -1, -1, errpipe_read, errpipe_write, |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
366 False, False, None) |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
367 finally: |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
368 os.close(errpipe_read) |
|
3b82e0d83bf9
Issue #8713: Support alternative start methods in multiprocessing on Unix.
Richard Oudkerk <shibturn@gmail.com>
parents:
83428
diff
changeset
|
369 os.close(errpipe_write) |
