From 6c631d76f22c50220bba51ec3191260d7e74b11f Mon Sep 17 00:00:00 2001 From: Ned Batchelder Date: Fri, 30 Jan 2015 21:07:25 -0500 Subject: Wildly experimental multiprocessing support. Covers most of #117. --- coverage/monkey.py | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 coverage/monkey.py (limited to 'coverage/monkey.py') diff --git a/coverage/monkey.py b/coverage/monkey.py new file mode 100644 index 00000000..42f185ea --- /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) -- cgit v1.2.1