diff options
author | Ned Batchelder <ned@nedbatchelder.com> | 2015-01-30 21:07:25 -0500 |
---|---|---|
committer | Ned Batchelder <ned@nedbatchelder.com> | 2015-01-30 21:07:25 -0500 |
commit | 3be0790dd8e844ddb597fd09e3d768cbca85ae43 (patch) | |
tree | 91a4a613bcab209a232a8a7d7e6759372a7e03db /coverage/monkey.py | |
parent | 043d07dee3992d3e7381a41c3ff716234e766a1c (diff) | |
download | python-coveragepy-3be0790dd8e844ddb597fd09e3d768cbca85ae43.tar.gz |
Wildly experimental multiprocessing support. Covers most of #117.
Diffstat (limited to 'coverage/monkey.py')
-rw-r--r-- | coverage/monkey.py | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/coverage/monkey.py b/coverage/monkey.py new file mode 100644 index 0000000..42f185e --- /dev/null +++ b/coverage/monkey.py @@ -0,0 +1,45 @@ +"""Monkey-patching to make coverage work right in some cases.""" + +import multiprocessing +import multiprocessing.process +import sys + +# An attribute that will be set on modules to indicate that they have been +# monkey-patched. +MARKER = "_coverage$patched" + + +def patch_multiprocessing(): + """Monkey-patch the multiprocessing module. + + This enables coverage measurement of processes started by multiprocessing. + This is wildly experimental! + + """ + if hasattr(multiprocessing, MARKER): + return + + if sys.version_info >= (3, 4): + klass = multiprocessing.process.BaseProcess + else: + klass = multiprocessing.Process + + original_bootstrap = klass._bootstrap + + class ProcessWithCoverage(klass): + def _bootstrap(self): + from coverage import Coverage + cov = Coverage(data_suffix=True) + cov.start() + try: + return original_bootstrap(self) + finally: + cov.stop() + cov.save() + + if sys.version_info >= (3, 4): + klass._bootstrap = ProcessWithCoverage._bootstrap + else: + multiprocessing.Process = ProcessWithCoverage + + setattr(multiprocessing, MARKER, 1) |