Skip to content
Open
5 changes: 4 additions & 1 deletion Lib/profiling/tracing/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,10 @@ def main():
# in the module's namespace.
globs = module.__dict__
globs.update({
'__spec__': spec,
# See gh-140729, set None to __spec__ according
# to the documentation,
# https://docs.python.org/3/reference/import.html#module-specs
'__spec__': None,
'__file__': spec.origin,
'__name__': spec.name,
'__package__': None,
Expand Down
47 changes: 47 additions & 0 deletions Lib/test/test_profiling/test_sampling_profiler/test_advanced.py
Original file line number Diff line number Diff line change
Expand Up @@ -234,3 +234,50 @@ def worker(x):

self.assertIn("Results: [2, 4, 6]", stdout)
self.assertNotIn("Can't pickle", stderr)


@requires_remote_subprocess_debugging()
class TestProcessRunSupport(unittest.TestCase):
"""
Test that Process works correctly with cProfile.
"""

def test_process_run_pickle(self):
# gh-140729: test use Process in cProfile.
val = 10
test_script = f'''
import multiprocessing

def worker(x):
print(__name__)
exit(x ** 2)

if __name__ == "__main__":
multiprocessing.set_start_method("spawn")
p = multiprocessing.Process(target=worker, args=({val},))
p.start()
p.join()
print("p.exitcode =", p.exitcode)
'''

with os_helper.temp_dir() as temp_dir:
script = script_helper.make_script(
temp_dir, 'test_process_run_pickle', test_script
)
with SuppressCrashReport():
with script_helper.spawn_python(
"-m", "cProfile",
script,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
text=True
) as proc:
try:
stdout, stderr = proc.communicate(timeout=SHORT_TIMEOUT)
except subprocess.TimeoutExpired:
proc.kill()
stdout, stderr = proc.communicate()

self.assertIn("__mp_main__", stdout)
self.assertIn(f"exitcode = {val**2}", stdout)
self.assertNotIn("Can't pickle", stderr)
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Fix pickling error in the cProfile module when using ``multiprocessing.Process``
script, which can not be properly pickled and executed.
Loading