- Implement multiprocessing-based parallel plotting - Add parallel_plot_helper.py for concurrent plot task execution - Use matplotlib 'Agg' backend for multiprocessing safety - Set OMP_NUM_THREADS=1 to prevent BLAS thread explosion - Use subprocess for binary data plots to avoid thread conflicts - Add fork bomb protection in main program This merge only includes plotting improvements and excludes MPI communication changes to preserve existing optimizations. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
30 lines
810 B
Python
30 lines
810 B
Python
import multiprocessing
|
|
|
|
def run_plot_task(task):
|
|
"""Execute a single plotting task.
|
|
|
|
Parameters
|
|
----------
|
|
task : tuple
|
|
A tuple of (function, args_tuple) where function is a callable
|
|
plotting function and args_tuple contains its arguments.
|
|
"""
|
|
func, args = task
|
|
return func(*args)
|
|
|
|
|
|
def run_plot_tasks_parallel(plot_tasks):
|
|
"""Execute a list of independent plotting tasks in parallel.
|
|
|
|
Uses the 'fork' context to create worker processes so that the main
|
|
script is NOT re-imported/re-executed in child processes.
|
|
|
|
Parameters
|
|
----------
|
|
plot_tasks : list of tuples
|
|
Each element is (function, args_tuple).
|
|
"""
|
|
ctx = multiprocessing.get_context('fork')
|
|
with ctx.Pool() as pool:
|
|
pool.map(run_plot_task, plot_tasks)
|