import json
import os
import sys
import time
from denet import profile
@profile(
base_interval_ms=100,
max_interval_ms=500,
output_file="profile_children.jsonl",
include_children=True, )
def cpu_intensive_with_children():
print(f"Parent process: {os.getpid()}")
children = []
for i in range(3):
pid = os.fork()
if pid == 0: print(f"Child process {i + 1}: {os.getpid()}")
start_time = time.time()
duration = 1.0 + i * 0.5
while time.time() - start_time < duration:
_ = [i * i * i for i in range(100000)]
print(f"Child {i + 1} finished")
sys.exit(0)
else:
children.append(pid)
start_time = time.time()
while time.time() - start_time < 1.5:
_ = [i * i for i in range(50000)]
print("Parent waiting for children...")
for pid in children:
os.waitpid(pid, 0)
print("All child processes completed!")
return "Completed successfully"
def main():
print("Starting profile decorator with child processes example...")
result, samples = cpu_intensive_with_children()
print(f"\nFunction result: {result}")
print(f"Total samples collected: {len(samples)}")
process_counts = []
max_process_count = 1
max_mem_kb = 0
total_cpu = 0
for sample in samples:
if isinstance(sample, str):
try:
sample = json.loads(sample)
except json.JSONDecodeError:
continue
process_count = 1
if "aggregated" in sample:
process_count = sample["aggregated"].get("process_count", 1)
elif "process_count" in sample:
process_count = sample["process_count"]
elif "children" in sample:
process_count = len(sample.get("children", []))
if sample.get("parent") is not None:
process_count += 1
process_counts.append(process_count)
max_process_count = max(max_process_count, process_count)
if "aggregated" in sample and "mem_rss_kb" in sample["aggregated"]:
max_mem_kb = max(max_mem_kb, sample["aggregated"]["mem_rss_kb"])
elif "mem_rss_kb" in sample:
max_mem_kb = max(max_mem_kb, sample["mem_rss_kb"])
if "aggregated" in sample and "cpu_usage" in sample["aggregated"]:
total_cpu += sample["aggregated"]["cpu_usage"]
elif "cpu_usage" in sample:
total_cpu += sample["cpu_usage"]
print("\n===== Profile Results =====")
print(f"Maximum processes detected: {max_process_count}")
print(f"Peak memory usage: {max_mem_kb / 1024:.2f} MB")
if samples:
avg_cpu = total_cpu / len(samples)
print(f"Average CPU usage: {avg_cpu:.2f}%")
if process_counts:
print("\nProcess count over time:")
for i, count in enumerate(process_counts):
if i % 3 == 0: print(f"Sample {i + 1}: {count} processes")
print("\nExample complete. Full results written to profile_children.jsonl")
return 0
if __name__ == "__main__":
sys.exit(main())