parsl 2024.5.13__tar.gz → 2024.5.20__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {parsl-2024.5.13/parsl.egg-info → parsl-2024.5.20}/PKG-INFO +2 -2
- {parsl-2024.5.13 → parsl-2024.5.20}/README.rst +7 -5
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/channels/base.py +2 -9
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/channels/local/local.py +3 -6
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/channels/oauth_ssh/oauth_ssh.py +2 -2
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/channels/ssh/ssh.py +2 -2
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/dataflow/dflow.py +1 -1
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/__init__.py +2 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/base.py +7 -7
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/high_throughput/executor.py +83 -83
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/high_throughput/interchange.py +6 -5
- parsl-2024.5.20/parsl/executors/high_throughput/mpi_executor.py +85 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/high_throughput/mpi_resource_management.py +3 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/remote.py +18 -24
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/local/local.py +1 -1
- parsl-2024.5.20/parsl/tests/test_mpi_apps/test_bad_mpi_config.py +33 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_mpi_apps/test_mpi_mode_disabled.py +0 -1
- parsl-2024.5.20/parsl/tests/test_mpi_apps/test_mpiex.py +64 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/version.py +1 -1
- {parsl-2024.5.13 → parsl-2024.5.20/parsl.egg-info}/PKG-INFO +2 -2
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl.egg-info/SOURCES.txt +2 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl.egg-info/requires.txt +2 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/setup.py +1 -1
- parsl-2024.5.13/parsl/tests/test_mpi_apps/test_bad_mpi_config.py +0 -41
- {parsl-2024.5.13 → parsl-2024.5.20}/LICENSE +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/MANIFEST.in +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/addresses.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/app/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/app/app.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/app/bash.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/app/errors.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/app/futures.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/app/python.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/benchmark/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/benchmark/perf.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/channels/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/channels/errors.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/channels/local/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/channels/oauth_ssh/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/channels/ssh/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/channels/ssh_il/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/channels/ssh_il/ssh_il.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/concurrent/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/config.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/ASPIRE1.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/Azure.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/ad_hoc.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/bridges.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/cc_in2p3.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/ec2.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/expanse.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/frontera.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/htex_local.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/illinoiscluster.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/kubernetes.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/local_threads.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/midway.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/osg.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/polaris.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/stampede2.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/summit.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/toss3_llnl.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/vineex_local.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/wqex_local.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/curvezmq.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/data_provider/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/data_provider/data_manager.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/data_provider/file_noop.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/data_provider/files.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/data_provider/ftp.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/data_provider/globus.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/data_provider/http.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/data_provider/rsync.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/data_provider/staging.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/data_provider/zip.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/dataflow/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/dataflow/errors.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/dataflow/futures.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/dataflow/memoization.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/dataflow/rundirs.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/dataflow/states.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/dataflow/taskrecord.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/errors.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/errors.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/flux/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/flux/execute_parsl_task.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/flux/executor.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/flux/flux_instance_manager.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/high_throughput/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/high_throughput/errors.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/high_throughput/manager_record.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/high_throughput/monitoring_info.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/high_throughput/mpi_prefix_composer.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/high_throughput/probe.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/high_throughput/process_worker_pool.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/high_throughput/zmq_pipes.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/radical/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/radical/executor.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/radical/rpex_master.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/radical/rpex_resources.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/radical/rpex_worker.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/status_handling.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/taskvine/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/taskvine/errors.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/taskvine/exec_parsl_function.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/taskvine/executor.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/taskvine/factory.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/taskvine/factory_config.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/taskvine/manager.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/taskvine/manager_config.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/taskvine/utils.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/threads.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/workqueue/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/workqueue/errors.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/workqueue/exec_parsl_function.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/workqueue/executor.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/workqueue/parsl_coprocess.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/jobs/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/jobs/error_handlers.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/jobs/errors.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/jobs/job_status_poller.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/jobs/states.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/jobs/strategy.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/launchers/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/launchers/base.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/launchers/errors.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/launchers/launchers.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/log_utils.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/db_manager.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/message_type.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/monitoring.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/queries/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/queries/pandas.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/radios.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/router.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/types.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/app.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/models.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/plots/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/plots/default/workflow_plots.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/templates/app.html +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/templates/dag.html +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/templates/error.html +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/templates/layout.html +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/templates/task.html +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/templates/workflow.html +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/utils.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/version.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/views.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/multiprocessing.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/process_loggers.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/ad_hoc/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/ad_hoc/ad_hoc.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/aws/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/aws/aws.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/aws/template.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/azure/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/azure/azure.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/azure/template.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/base.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/cluster_provider.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/cobalt/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/cobalt/cobalt.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/cobalt/template.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/condor/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/condor/condor.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/condor/template.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/errors.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/googlecloud/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/googlecloud/googlecloud.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/grid_engine/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/grid_engine/grid_engine.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/grid_engine/template.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/kubernetes/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/kubernetes/kube.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/kubernetes/template.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/local/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/lsf/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/lsf/lsf.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/lsf/template.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/pbspro/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/pbspro/pbspro.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/pbspro/template.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/slurm/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/slurm/slurm.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/slurm/template.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/torque/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/torque/template.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/torque/torque.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/py.typed +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/serialize/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/serialize/base.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/serialize/concretes.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/serialize/errors.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/serialize/facade.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/serialize/proxystore.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/callables_helper.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/ad_hoc_cluster_htex.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/azure_single_node.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/bluewaters.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/bridges.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/cc_in2p3.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/comet.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/cooley_htex.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/ec2_single_node.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/ec2_spot.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/frontera.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/htex_ad_hoc_cluster.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/htex_local.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/htex_local_alternate.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/htex_local_intask_staging.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/htex_local_rsync_staging.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/local_adhoc.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/local_radical.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/local_radical_mpi.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/local_threads.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/local_threads_checkpoint_periodic.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/local_threads_globus.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/local_threads_monitoring.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/local_threads_no_cache.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/midway.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/nscc_singapore.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/osg_htex.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/petrelkube.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/summit.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/swan_htex.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/taskvine_ex.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/theta.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/user_opts.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/workqueue_ex.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/conftest.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/integration/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/integration/latency.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/integration/test_apps/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/integration/test_channels/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/integration/test_channels/test_channels.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/integration/test_channels/test_local_channel.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/integration/test_channels/test_scp_1.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/integration/test_channels/test_ssh_1.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/integration/test_channels/test_ssh_errors.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/integration/test_channels/test_ssh_file_transport.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/integration/test_channels/test_ssh_interactive.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/integration/test_stress/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/manual_tests/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/manual_tests/htex_local.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/manual_tests/test_ad_hoc_htex.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/manual_tests/test_basic.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/manual_tests/test_fan_in_out_htex_remote.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/manual_tests/test_log_filter.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/manual_tests/test_memory_limits.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/manual_tests/test_oauth_ssh.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/manual_tests/test_regression_220.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/manual_tests/test_udp_simple.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/manual_tests/test_worker_count.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/scaling_tests/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/scaling_tests/htex_local.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/scaling_tests/local_threads.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/scaling_tests/test_scale.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/scaling_tests/vineex_condor.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/scaling_tests/vineex_local.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/scaling_tests/wqex_condor.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/scaling_tests/wqex_local.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/site_tests/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/site_tests/site_config_selector.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/site_tests/test_provider.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/site_tests/test_site.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/sites/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/sites/test_affinity.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/sites/test_concurrent.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/sites/test_dynamic_executor.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/sites/test_ec2.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/sites/test_launchers.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/sites/test_local_adhoc.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/sites/test_mpi/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/sites/test_worker_info.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_aalst_patterns.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_bash_apps/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_bash_apps/test_basic.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_bash_apps/test_memoize.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_bash_apps/test_multiline.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_bash_apps/test_pipeline.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_bash_apps/test_std_uri.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_bash_apps/test_stdout.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_callables.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_channels/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_channels/test_large_output.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_checkpointing/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_checkpointing/test_periodic.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_checkpointing/test_python_checkpoint_3.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_checkpointing/test_regression_233.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_checkpointing/test_task_exit.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_curvezmq.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_docs/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_docs/test_from_slides.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_docs/test_kwargs.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_docs/test_workflow1.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_docs/test_workflow2.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_docs/test_workflow4.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_error_handling/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_error_handling/test_fail.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_error_handling/test_python_walltime.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_error_handling/test_rand_fail.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_error_handling/test_resource_spec.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_error_handling/test_retries.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_flowcontrol/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_flux.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_htex/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_htex/test_basic.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_htex/test_connected_blocks.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_htex/test_cpu_affinity_explicit.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_htex/test_disconnected_blocks.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_htex/test_drain.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_htex/test_htex.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_htex/test_manager_failure.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_htex/test_managers_command.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_htex/test_missing_worker.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_htex/test_multiple_disconnected_blocks.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_htex/test_worker_failure.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_htex/test_zmq_binding.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_monitoring/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_monitoring/test_app_names.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_monitoring/test_basic.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_monitoring/test_fuzz_zmq.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_monitoring/test_incomplete_futures.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_monitoring/test_memoization_representation.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_monitoring/test_stdouterr.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_mpi_apps/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_mpi_apps/test_mpi_prefix.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_mpi_apps/test_mpi_scheduler.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_mpi_apps/test_resource_spec.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_providers/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_providers/test_cobalt_deprecation_warning.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_providers/test_local_provider.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_providers/test_pbspro_template.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_providers/test_slurm_instantiate.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_providers/test_slurm_template.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_providers/test_submiterror_deprecation.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_basic.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_context_manager.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_dep_standard_futures.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_depfail_propagation.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_fail.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_futures.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_garbage_collect.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_join.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_lifted.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_mapred.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_memoize_2.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_outputs.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_overview.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_pipeline.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_simple.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_timeout.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_type5.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_radical/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_radical/test_mpi_funcs.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_regression/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_regression/test_1480.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_regression/test_1653.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_regression/test_221.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_regression/test_226.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_regression/test_2652.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_regression/test_69a.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_regression/test_854.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_regression/test_97_parallelism_0.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_regression/test_98.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_scaling/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_scaling/test_block_error_handler.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_scaling/test_regression_1621.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_scaling/test_scale_down.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_scaling/test_shutdown_scalein.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_serialization/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_serialization/test_2555_caching_deserializer.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_serialization/test_basic.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_serialization/test_htex_code_cache.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_serialization/test_pack_resource_spec.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_serialization/test_proxystore_configured.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_serialization/test_proxystore_impl.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_shutdown/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_shutdown/test_kill_monitoring.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_staging/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_staging/staging_provider.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_staging/test_1316.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_staging/test_docs_1.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_staging/test_docs_2.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_staging/test_file.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_staging/test_file_apps.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_staging/test_file_staging.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_staging/test_output_chain_filenames.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_staging/test_staging_globus.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_staging/test_staging_https.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_staging/test_staging_stdout.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_staging/test_zip_in.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_staging/test_zip_out.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_staging/test_zip_to_zip.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_summary.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_thread_parallelism.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_threads/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_threads/test_configs.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_utils/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_utils/test_representation_mixin.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/unit/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/unit/test_file.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/utils.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/usage_tracking/__init__.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/usage_tracking/api.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/usage_tracking/usage.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl/utils.py +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl.egg-info/dependency_links.txt +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl.egg-info/entry_points.txt +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/parsl.egg-info/top_level.txt +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/requirements.txt +0 -0
- {parsl-2024.5.13 → parsl-2024.5.20}/setup.cfg +0 -0
@@ -1,9 +1,9 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: parsl
|
3
|
-
Version: 2024.5.
|
3
|
+
Version: 2024.5.20
|
4
4
|
Summary: Simple data dependent workflows in Python
|
5
5
|
Home-page: https://github.com/Parsl/parsl
|
6
|
-
Download-URL: https://github.com/Parsl/parsl/archive/2024.05.
|
6
|
+
Download-URL: https://github.com/Parsl/parsl/archive/2024.05.20.tar.gz
|
7
7
|
Author: The Parsl Team
|
8
8
|
Author-email: parsl@googlegroups.com
|
9
9
|
License: Apache 2.0
|
@@ -22,17 +22,19 @@ Parsl lets you chain functions together and will launch each function as inputs
|
|
22
22
|
return x + 1
|
23
23
|
|
24
24
|
@python_app
|
25
|
-
def g(x):
|
26
|
-
return x
|
25
|
+
def g(x, y):
|
26
|
+
return x + y
|
27
27
|
|
28
28
|
# Start Parsl on a single computer
|
29
29
|
with parsl.load():
|
30
|
-
# These functions now return Futures
|
30
|
+
# These functions now return Futures
|
31
31
|
future = f(1)
|
32
32
|
assert future.result() == 2
|
33
33
|
|
34
|
-
|
35
|
-
|
34
|
+
# Functions run concurrently, can be chained
|
35
|
+
f_a, f_b = f(2), f(3)
|
36
|
+
future = g(f_a, f_b)
|
37
|
+
assert future.result() == 7
|
36
38
|
|
37
39
|
|
38
40
|
Start with the `configuration quickstart <https://parsl.readthedocs.io/en/stable/quickstart.html#getting-started>`_ to learn how to tell Parsl how to use your computing resource,
|
@@ -89,15 +89,8 @@ class Channel(metaclass=ABCMeta):
|
|
89
89
|
pass
|
90
90
|
|
91
91
|
@abstractmethod
|
92
|
-
def close(self) ->
|
93
|
-
''' Closes the channel.
|
94
|
-
|
95
|
-
Args:
|
96
|
-
None
|
97
|
-
|
98
|
-
Returns:
|
99
|
-
Bool
|
100
|
-
|
92
|
+
def close(self) -> None:
|
93
|
+
''' Closes the channel.
|
101
94
|
'''
|
102
95
|
pass
|
103
96
|
|
@@ -107,13 +107,10 @@ class LocalChannel(Channel, RepresentationMixin):
|
|
107
107
|
def pull_file(self, remote_source, local_dir):
|
108
108
|
return self.push_file(remote_source, local_dir)
|
109
109
|
|
110
|
-
def close(self):
|
111
|
-
''' There's nothing to close here, and this
|
112
|
-
|
113
|
-
Returns:
|
114
|
-
- False, because it really did not "close" this channel.
|
110
|
+
def close(self) -> None:
|
111
|
+
''' There's nothing to close here, and so this doesn't do anything
|
115
112
|
'''
|
116
|
-
|
113
|
+
pass
|
117
114
|
|
118
115
|
def isdir(self, path):
|
119
116
|
"""Return true if the path refers to an existing directory.
|
@@ -217,9 +217,9 @@ class SSHChannel(Channel, RepresentationMixin):
|
|
217
217
|
|
218
218
|
return local_dest
|
219
219
|
|
220
|
-
def close(self):
|
220
|
+
def close(self) -> None:
|
221
221
|
if self._is_connected():
|
222
|
-
|
222
|
+
self.ssh_client.close()
|
223
223
|
|
224
224
|
def isdir(self, path):
|
225
225
|
"""Return true if the path refers to an existing directory.
|
@@ -1156,7 +1156,7 @@ class DataFlowKernel:
|
|
1156
1156
|
executor.run_id = self.run_id
|
1157
1157
|
executor.run_dir = self.run_dir
|
1158
1158
|
executor.hub_address = self.hub_address
|
1159
|
-
executor.
|
1159
|
+
executor.hub_zmq_port = self.hub_zmq_port
|
1160
1160
|
if self.monitoring:
|
1161
1161
|
executor.monitoring_radio = self.monitoring.radio
|
1162
1162
|
if hasattr(executor, 'provider'):
|
@@ -1,9 +1,11 @@
|
|
1
1
|
from parsl.executors.threads import ThreadPoolExecutor
|
2
2
|
from parsl.executors.workqueue.executor import WorkQueueExecutor
|
3
3
|
from parsl.executors.high_throughput.executor import HighThroughputExecutor
|
4
|
+
from parsl.executors.high_throughput.mpi_executor import MPIExecutor
|
4
5
|
from parsl.executors.flux.executor import FluxExecutor
|
5
6
|
|
6
7
|
__all__ = ['ThreadPoolExecutor',
|
7
8
|
'HighThroughputExecutor',
|
9
|
+
'MPIExecutor',
|
8
10
|
'WorkQueueExecutor',
|
9
11
|
'FluxExecutor']
|
@@ -50,13 +50,13 @@ class ParslExecutor(metaclass=ABCMeta):
|
|
50
50
|
self,
|
51
51
|
*,
|
52
52
|
hub_address: Optional[str] = None,
|
53
|
-
|
53
|
+
hub_zmq_port: Optional[int] = None,
|
54
54
|
monitoring_radio: Optional[MonitoringRadio] = None,
|
55
55
|
run_dir: str = ".",
|
56
56
|
run_id: Optional[str] = None,
|
57
57
|
):
|
58
58
|
self.hub_address = hub_address
|
59
|
-
self.
|
59
|
+
self.hub_zmq_port = hub_zmq_port
|
60
60
|
self.monitoring_radio = monitoring_radio
|
61
61
|
self.run_dir = os.path.abspath(run_dir)
|
62
62
|
self.run_id = run_id
|
@@ -136,14 +136,14 @@ class ParslExecutor(metaclass=ABCMeta):
|
|
136
136
|
self._hub_address = value
|
137
137
|
|
138
138
|
@property
|
139
|
-
def
|
139
|
+
def hub_zmq_port(self) -> Optional[int]:
|
140
140
|
"""Port to the Hub for monitoring.
|
141
141
|
"""
|
142
|
-
return self.
|
142
|
+
return self._hub_zmq_port
|
143
143
|
|
144
|
-
@
|
145
|
-
def
|
146
|
-
self.
|
144
|
+
@hub_zmq_port.setter
|
145
|
+
def hub_zmq_port(self, value: Optional[int]) -> None:
|
146
|
+
self._hub_zmq_port = value
|
147
147
|
|
148
148
|
@property
|
149
149
|
def monitoring_radio(self) -> Optional[MonitoringRadio]:
|
@@ -62,47 +62,7 @@ DEFAULT_LAUNCH_CMD = ("process_worker_pool.py {debug} {max_workers_per_node} "
|
|
62
62
|
"--mpi-launcher={mpi_launcher} "
|
63
63
|
"--available-accelerators {accelerators}")
|
64
64
|
|
65
|
-
|
66
|
-
class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageInformation):
|
67
|
-
"""Executor designed for cluster-scale
|
68
|
-
|
69
|
-
The HighThroughputExecutor system has the following components:
|
70
|
-
1. The HighThroughputExecutor instance which is run as part of the Parsl script.
|
71
|
-
2. The Interchange which acts as a load-balancing proxy between workers and Parsl
|
72
|
-
3. The multiprocessing based worker pool which coordinates task execution over several
|
73
|
-
cores on a node.
|
74
|
-
4. ZeroMQ pipes connect the HighThroughputExecutor, Interchange and the process_worker_pool
|
75
|
-
|
76
|
-
Here is a diagram
|
77
|
-
|
78
|
-
.. code:: python
|
79
|
-
|
80
|
-
|
81
|
-
| Data | Executor | Interchange | External Process(es)
|
82
|
-
| Flow | | |
|
83
|
-
Task | Kernel | | |
|
84
|
-
+----->|-------->|------------>|->outgoing_q---|-> process_worker_pool
|
85
|
-
| | | | batching | | |
|
86
|
-
Parsl<---Fut-| | | load-balancing| result exception
|
87
|
-
^ | | | watchdogs | | |
|
88
|
-
| | | Q_mngmnt | | V V
|
89
|
-
| | | Thread<--|-incoming_q<---|--- +---------+
|
90
|
-
| | | | | |
|
91
|
-
| | | | | |
|
92
|
-
+----update_fut-----+
|
93
|
-
|
94
|
-
|
95
|
-
Each of the workers in each process_worker_pool has access to its local rank through
|
96
|
-
an environmental variable, ``PARSL_WORKER_RANK``. The local rank is unique for each process
|
97
|
-
and is an integer in the range from 0 to the number of workers per in the pool minus 1.
|
98
|
-
The workers also have access to the ID of the worker pool as ``PARSL_WORKER_POOL_ID``
|
99
|
-
and the size of the worker pool as ``PARSL_WORKER_COUNT``.
|
100
|
-
|
101
|
-
|
102
|
-
Parameters
|
103
|
-
----------
|
104
|
-
|
105
|
-
provider : :class:`~parsl.providers.base.ExecutionProvider`
|
65
|
+
GENERAL_HTEX_PARAM_DOCS = """provider : :class:`~parsl.providers.base.ExecutionProvider`
|
106
66
|
Provider to access computation resources. Can be one of :class:`~parsl.providers.aws.aws.EC2Provider`,
|
107
67
|
:class:`~parsl.providers.cobalt.cobalt.Cobalt`,
|
108
68
|
:class:`~parsl.providers.condor.condor.Condor`,
|
@@ -148,39 +108,6 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
|
|
148
108
|
worker_debug : Bool
|
149
109
|
Enables worker debug logging.
|
150
110
|
|
151
|
-
cores_per_worker : float
|
152
|
-
cores to be assigned to each worker. Oversubscription is possible
|
153
|
-
by setting cores_per_worker < 1.0. Default=1
|
154
|
-
|
155
|
-
mem_per_worker : float
|
156
|
-
GB of memory required per worker. If this option is specified, the node manager
|
157
|
-
will check the available memory at startup and limit the number of workers such that
|
158
|
-
the there's sufficient memory for each worker. Default: None
|
159
|
-
|
160
|
-
max_workers : int
|
161
|
-
Deprecated. Please use max_workers_per_node instead.
|
162
|
-
|
163
|
-
max_workers_per_node : int
|
164
|
-
Caps the number of workers launched per node. Default: None
|
165
|
-
|
166
|
-
cpu_affinity: string
|
167
|
-
Whether or how each worker process sets thread affinity. Options include "none" to forgo
|
168
|
-
any CPU affinity configuration, "block" to assign adjacent cores to workers
|
169
|
-
(ex: assign 0-1 to worker 0, 2-3 to worker 1), and
|
170
|
-
"alternating" to assign cores to workers in round-robin
|
171
|
-
(ex: assign 0,2 to worker 0, 1,3 to worker 1).
|
172
|
-
The "block-reverse" option assigns adjacent cores to workers, but assigns
|
173
|
-
the CPUs with large indices to low index workers (ex: assign 2-3 to worker 1, 0,1 to worker 2)
|
174
|
-
|
175
|
-
available_accelerators: int | list
|
176
|
-
Accelerators available for workers to use. Each worker will be pinned to exactly one of the provided
|
177
|
-
accelerators, and no more workers will be launched than the number of accelerators.
|
178
|
-
|
179
|
-
Either provide the list of accelerator names or the number available. If a number is provided,
|
180
|
-
Parsl will create names as integers starting with 0.
|
181
|
-
|
182
|
-
default: empty list
|
183
|
-
|
184
111
|
prefetch_capacity : int
|
185
112
|
Number of tasks that could be prefetched over available worker capacity.
|
186
113
|
When there are a few tasks (<100) or when tasks are long running, this option should
|
@@ -214,6 +141,85 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
|
|
214
141
|
worker_logdir_root : string
|
215
142
|
In case of a remote file system, specify the path to where logs will be kept.
|
216
143
|
|
144
|
+
encrypted : bool
|
145
|
+
Flag to enable/disable encryption (CurveZMQ). Default is False.
|
146
|
+
""" # Documentation for params used by both HTEx and MPIEx
|
147
|
+
|
148
|
+
|
149
|
+
class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageInformation):
|
150
|
+
__doc__ = f"""Executor designed for cluster-scale
|
151
|
+
|
152
|
+
The HighThroughputExecutor system has the following components:
|
153
|
+
1. The HighThroughputExecutor instance which is run as part of the Parsl script.
|
154
|
+
2. The Interchange which acts as a load-balancing proxy between workers and Parsl
|
155
|
+
3. The multiprocessing based worker pool which coordinates task execution over several
|
156
|
+
cores on a node.
|
157
|
+
4. ZeroMQ pipes connect the HighThroughputExecutor, Interchange and the process_worker_pool
|
158
|
+
|
159
|
+
Here is a diagram
|
160
|
+
|
161
|
+
.. code:: python
|
162
|
+
|
163
|
+
|
164
|
+
| Data | Executor | Interchange | External Process(es)
|
165
|
+
| Flow | | |
|
166
|
+
Task | Kernel | | |
|
167
|
+
+----->|-------->|------------>|->outgoing_q---|-> process_worker_pool
|
168
|
+
| | | | batching | | |
|
169
|
+
Parsl<---Fut-| | | load-balancing| result exception
|
170
|
+
^ | | | watchdogs | | |
|
171
|
+
| | | Q_mngmnt | | V V
|
172
|
+
| | | Thread<--|-incoming_q<---|--- +---------+
|
173
|
+
| | | | | |
|
174
|
+
| | | | | |
|
175
|
+
+----update_fut-----+
|
176
|
+
|
177
|
+
|
178
|
+
Each of the workers in each process_worker_pool has access to its local rank through
|
179
|
+
an environmental variable, ``PARSL_WORKER_RANK``. The local rank is unique for each process
|
180
|
+
and is an integer in the range from 0 to the number of workers per in the pool minus 1.
|
181
|
+
The workers also have access to the ID of the worker pool as ``PARSL_WORKER_POOL_ID``
|
182
|
+
and the size of the worker pool as ``PARSL_WORKER_COUNT``.
|
183
|
+
|
184
|
+
|
185
|
+
Parameters
|
186
|
+
----------
|
187
|
+
|
188
|
+
{GENERAL_HTEX_PARAM_DOCS}
|
189
|
+
|
190
|
+
cores_per_worker : float
|
191
|
+
cores to be assigned to each worker. Oversubscription is possible
|
192
|
+
by setting cores_per_worker < 1.0. Default=1
|
193
|
+
|
194
|
+
mem_per_worker : float
|
195
|
+
GB of memory required per worker. If this option is specified, the node manager
|
196
|
+
will check the available memory at startup and limit the number of workers such that
|
197
|
+
the there's sufficient memory for each worker. Default: None
|
198
|
+
|
199
|
+
max_workers : int
|
200
|
+
Deprecated. Please use max_workers_per_node instead.
|
201
|
+
|
202
|
+
max_workers_per_node : int
|
203
|
+
Caps the number of workers launched per node. Default: None
|
204
|
+
|
205
|
+
cpu_affinity: string
|
206
|
+
Whether or how each worker process sets thread affinity. Options include "none" to forgo
|
207
|
+
any CPU affinity configuration, "block" to assign adjacent cores to workers
|
208
|
+
(ex: assign 0-1 to worker 0, 2-3 to worker 1), and
|
209
|
+
"alternating" to assign cores to workers in round-robin
|
210
|
+
(ex: assign 0,2 to worker 0, 1,3 to worker 1).
|
211
|
+
The "block-reverse" option assigns adjacent cores to workers, but assigns
|
212
|
+
the CPUs with large indices to low index workers (ex: assign 2-3 to worker 1, 0,1 to worker 2)
|
213
|
+
|
214
|
+
available_accelerators: int | list
|
215
|
+
Accelerators available for workers to use. Each worker will be pinned to exactly one of the provided
|
216
|
+
accelerators, and no more workers will be launched than the number of accelerators.
|
217
|
+
|
218
|
+
Either provide the list of accelerator names or the number available. If a number is provided,
|
219
|
+
Parsl will create names as integers starting with 0.
|
220
|
+
|
221
|
+
default: empty list
|
222
|
+
|
217
223
|
enable_mpi_mode: bool
|
218
224
|
If enabled, MPI launch prefixes will be composed for the batch scheduler based on
|
219
225
|
the nodes available in each batch job and the resource_specification dict passed
|
@@ -224,9 +230,6 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
|
|
224
230
|
This field is only used if enable_mpi_mode is set. Select one from the
|
225
231
|
list of supported MPI launchers = ("srun", "aprun", "mpiexec").
|
226
232
|
default: "mpiexec"
|
227
|
-
|
228
|
-
encrypted : bool
|
229
|
-
Flag to enable/disable encryption (CurveZMQ). Default is False.
|
230
233
|
"""
|
231
234
|
|
232
235
|
@typeguard.typechecked
|
@@ -305,9 +308,6 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
|
|
305
308
|
self._workers_per_node = 1 # our best guess-- we do not have any provider hints
|
306
309
|
|
307
310
|
self._task_counter = 0
|
308
|
-
self.run_id = None # set to the correct run_id in dfk
|
309
|
-
self.hub_address = None # set to the correct hub address in dfk
|
310
|
-
self.hub_port = None # set to the correct hub port in dfk
|
311
311
|
self.worker_ports = worker_ports
|
312
312
|
self.worker_port_range = worker_port_range
|
313
313
|
self.interchange_proc: Optional[Process] = None
|
@@ -326,8 +326,8 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
|
|
326
326
|
assert mpi_launcher in VALID_LAUNCHERS, \
|
327
327
|
f"mpi_launcher must be set to one of {VALID_LAUNCHERS}"
|
328
328
|
if self.enable_mpi_mode:
|
329
|
-
assert isinstance(self.provider.launcher, parsl.launchers.
|
330
|
-
"mpi_mode requires the provider to be configured to use a
|
329
|
+
assert isinstance(self.provider.launcher, parsl.launchers.SimpleLauncher), \
|
330
|
+
"mpi_mode requires the provider to be configured to use a SimpleLauncher"
|
331
331
|
|
332
332
|
self.mpi_launcher = mpi_launcher
|
333
333
|
|
@@ -541,7 +541,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
|
|
541
541
|
"worker_ports": self.worker_ports,
|
542
542
|
"worker_port_range": self.worker_port_range,
|
543
543
|
"hub_address": self.hub_address,
|
544
|
-
"
|
544
|
+
"hub_zmq_port": self.hub_zmq_port,
|
545
545
|
"logdir": self.logdir,
|
546
546
|
"heartbeat_threshold": self.heartbeat_threshold,
|
547
547
|
"poll_period": self.poll_period,
|
@@ -74,7 +74,7 @@ class Interchange:
|
|
74
74
|
worker_ports: Optional[Tuple[int, int]] = None,
|
75
75
|
worker_port_range: Tuple[int, int] = (54000, 55000),
|
76
76
|
hub_address: Optional[str] = None,
|
77
|
-
|
77
|
+
hub_zmq_port: Optional[int] = None,
|
78
78
|
heartbeat_threshold: int = 60,
|
79
79
|
logdir: str = ".",
|
80
80
|
logging_level: int = logging.INFO,
|
@@ -105,7 +105,7 @@ class Interchange:
|
|
105
105
|
The IP address at which the interchange can send info about managers to when monitoring is enabled.
|
106
106
|
Default: None (meaning monitoring disabled)
|
107
107
|
|
108
|
-
|
108
|
+
hub_zmq_port : str
|
109
109
|
The port at which the interchange can send info about managers to when monitoring is enabled.
|
110
110
|
Default: None (meaning monitoring disabled)
|
111
111
|
|
@@ -151,7 +151,7 @@ class Interchange:
|
|
151
151
|
logger.info("Connected to client")
|
152
152
|
|
153
153
|
self.hub_address = hub_address
|
154
|
-
self.
|
154
|
+
self.hub_zmq_port = hub_zmq_port
|
155
155
|
|
156
156
|
self.pending_task_queue: queue.Queue[Any] = queue.Queue(maxsize=10 ** 6)
|
157
157
|
self.count = 0
|
@@ -244,12 +244,12 @@ class Interchange:
|
|
244
244
|
logger.debug(f"Fetched {task_counter} tasks so far")
|
245
245
|
|
246
246
|
def _create_monitoring_channel(self) -> Optional[zmq.Socket]:
|
247
|
-
if self.hub_address and self.
|
247
|
+
if self.hub_address and self.hub_zmq_port:
|
248
248
|
logger.info("Connecting to MonitoringHub")
|
249
249
|
# This is a one-off because monitoring is unencrypted
|
250
250
|
hub_channel = zmq.Context().socket(zmq.DEALER)
|
251
251
|
hub_channel.set_hwm(0)
|
252
|
-
hub_channel.connect("tcp://{}:{}".format(self.hub_address, self.
|
252
|
+
hub_channel.connect("tcp://{}:{}".format(self.hub_address, self.hub_zmq_port))
|
253
253
|
logger.info("Connected to MonitoringHub")
|
254
254
|
return hub_channel
|
255
255
|
else:
|
@@ -329,6 +329,7 @@ class Interchange:
|
|
329
329
|
reply = None
|
330
330
|
|
331
331
|
else:
|
332
|
+
logger.error(f"Received unknown command: {command_req}")
|
332
333
|
reply = None
|
333
334
|
|
334
335
|
logger.debug("Reply: {}".format(reply))
|
@@ -0,0 +1,85 @@
|
|
1
|
+
"""A simplified interface for HTEx when running in MPI mode"""
|
2
|
+
from typing import Optional, Tuple, List, Union, Callable, Dict
|
3
|
+
|
4
|
+
import typeguard
|
5
|
+
|
6
|
+
from parsl.data_provider.staging import Staging
|
7
|
+
from parsl.executors.high_throughput.executor import HighThroughputExecutor, GENERAL_HTEX_PARAM_DOCS
|
8
|
+
from parsl.executors.status_handling import BlockProviderExecutor
|
9
|
+
from parsl.jobs.states import JobStatus
|
10
|
+
from parsl.providers import LocalProvider
|
11
|
+
from parsl.providers.base import ExecutionProvider
|
12
|
+
|
13
|
+
|
14
|
+
class MPIExecutor(HighThroughputExecutor):
|
15
|
+
__doc__ = f"""A version of :class:`~parsl.HighThroughputExecutor` tuned for executing multi-node (e.g., MPI) tasks.
|
16
|
+
|
17
|
+
The Provider _must_ use the :class:`~parsl.launchers.SimpleLauncher`,
|
18
|
+
which places a single pool of workers on the first node of a block.
|
19
|
+
Each worker can then make system calls which use an MPI launcher (e.g., ``mpirun``, ``srun``)
|
20
|
+
to spawn multi-node tasks.
|
21
|
+
|
22
|
+
Specify the maximum number of multi-node tasks to run at once using ``max_workers_per_block``.
|
23
|
+
The maximum number should be smaller than the ``nodes_per_block`` in the Provider.
|
24
|
+
|
25
|
+
Parameters
|
26
|
+
----------
|
27
|
+
max_workers_per_block: int
|
28
|
+
Maximum number of MPI applications to run at once per block
|
29
|
+
|
30
|
+
{GENERAL_HTEX_PARAM_DOCS}
|
31
|
+
"""
|
32
|
+
|
33
|
+
@typeguard.typechecked
|
34
|
+
def __init__(self,
|
35
|
+
label: str = 'MPIExecutor',
|
36
|
+
provider: ExecutionProvider = LocalProvider(),
|
37
|
+
launch_cmd: Optional[str] = None,
|
38
|
+
address: Optional[str] = None,
|
39
|
+
worker_ports: Optional[Tuple[int, int]] = None,
|
40
|
+
worker_port_range: Optional[Tuple[int, int]] = (54000, 55000),
|
41
|
+
interchange_port_range: Optional[Tuple[int, int]] = (55000, 56000),
|
42
|
+
storage_access: Optional[List[Staging]] = None,
|
43
|
+
working_dir: Optional[str] = None,
|
44
|
+
worker_debug: bool = False,
|
45
|
+
max_workers_per_block: int = 1,
|
46
|
+
prefetch_capacity: int = 0,
|
47
|
+
heartbeat_threshold: int = 120,
|
48
|
+
heartbeat_period: int = 30,
|
49
|
+
drain_period: Optional[int] = None,
|
50
|
+
poll_period: int = 10,
|
51
|
+
address_probe_timeout: Optional[int] = None,
|
52
|
+
worker_logdir_root: Optional[str] = None,
|
53
|
+
mpi_launcher: str = "mpiexec",
|
54
|
+
block_error_handler: Union[bool, Callable[[BlockProviderExecutor, Dict[str, JobStatus]], None]] = True,
|
55
|
+
encrypted: bool = False):
|
56
|
+
super().__init__(
|
57
|
+
# Hard-coded settings
|
58
|
+
cores_per_worker=1e-9, # Ensures there will be at least an absurd number of workers
|
59
|
+
enable_mpi_mode=True,
|
60
|
+
max_workers_per_node=max_workers_per_block,
|
61
|
+
|
62
|
+
# Everything else
|
63
|
+
label=label,
|
64
|
+
provider=provider,
|
65
|
+
launch_cmd=launch_cmd,
|
66
|
+
address=address,
|
67
|
+
worker_ports=worker_ports,
|
68
|
+
worker_port_range=worker_port_range,
|
69
|
+
interchange_port_range=interchange_port_range,
|
70
|
+
storage_access=storage_access,
|
71
|
+
working_dir=working_dir,
|
72
|
+
worker_debug=worker_debug,
|
73
|
+
prefetch_capacity=prefetch_capacity,
|
74
|
+
heartbeat_threshold=heartbeat_threshold,
|
75
|
+
heartbeat_period=heartbeat_period,
|
76
|
+
drain_period=drain_period,
|
77
|
+
poll_period=poll_period,
|
78
|
+
address_probe_timeout=address_probe_timeout,
|
79
|
+
worker_logdir_root=worker_logdir_root,
|
80
|
+
mpi_launcher=mpi_launcher,
|
81
|
+
block_error_handler=block_error_handler,
|
82
|
+
encrypted=encrypted
|
83
|
+
)
|
84
|
+
|
85
|
+
self.max_workers_per_block = max_workers_per_block
|
{parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/high_throughput/mpi_resource_management.py
RENAMED
@@ -208,8 +208,11 @@ class MPITaskScheduler(TaskScheduler):
|
|
208
208
|
"""Return result and relinquish provisioned nodes"""
|
209
209
|
result_pkl = self.pending_result_q.get(block, timeout=timeout)
|
210
210
|
result_dict = pickle.loads(result_pkl)
|
211
|
+
# TODO (wardlt): If the task did not request nodes, it won't be in `self._map_tasks_to_nodes`.
|
212
|
+
# Causes Parsl to hang. See Issue #3427
|
211
213
|
if result_dict["type"] == "result":
|
212
214
|
task_id = result_dict["task_id"]
|
215
|
+
assert task_id in self._map_tasks_to_nodes, "You are about to experience issue #3427"
|
213
216
|
nodes_to_reallocate = self._map_tasks_to_nodes[task_id]
|
214
217
|
self._return_nodes(nodes_to_reallocate)
|
215
218
|
self._schedule_backlog_tasks()
|
@@ -96,6 +96,22 @@ def monitor_wrapper(*,
|
|
96
96
|
return (wrapped, args, new_kwargs)
|
97
97
|
|
98
98
|
|
99
|
+
def get_radio(radio_mode: str, monitoring_hub_url: str, task_id: int, run_dir: str) -> MonitoringRadio:
|
100
|
+
radio: MonitoringRadio
|
101
|
+
if radio_mode == "udp":
|
102
|
+
radio = UDPRadio(monitoring_hub_url,
|
103
|
+
source_id=task_id)
|
104
|
+
elif radio_mode == "htex":
|
105
|
+
radio = HTEXRadio(monitoring_hub_url,
|
106
|
+
source_id=task_id)
|
107
|
+
elif radio_mode == "filesystem":
|
108
|
+
radio = FilesystemRadio(monitoring_url=monitoring_hub_url,
|
109
|
+
source_id=task_id, run_dir=run_dir)
|
110
|
+
else:
|
111
|
+
raise RuntimeError(f"Unknown radio mode: {radio_mode}")
|
112
|
+
return radio
|
113
|
+
|
114
|
+
|
99
115
|
@wrap_with_logs
|
100
116
|
def send_first_message(try_id: int,
|
101
117
|
task_id: int,
|
@@ -122,18 +138,7 @@ def send_first_last_message(try_id: int,
|
|
122
138
|
import platform
|
123
139
|
import os
|
124
140
|
|
125
|
-
radio
|
126
|
-
if radio_mode == "udp":
|
127
|
-
radio = UDPRadio(monitoring_hub_url,
|
128
|
-
source_id=task_id)
|
129
|
-
elif radio_mode == "htex":
|
130
|
-
radio = HTEXRadio(monitoring_hub_url,
|
131
|
-
source_id=task_id)
|
132
|
-
elif radio_mode == "filesystem":
|
133
|
-
radio = FilesystemRadio(monitoring_url=monitoring_hub_url,
|
134
|
-
source_id=task_id, run_dir=run_dir)
|
135
|
-
else:
|
136
|
-
raise RuntimeError(f"Unknown radio mode: {radio_mode}")
|
141
|
+
radio = get_radio(radio_mode, monitoring_hub_url, task_id, run_dir)
|
137
142
|
|
138
143
|
msg = (MessageType.RESOURCE_INFO,
|
139
144
|
{'run_id': run_id,
|
@@ -178,18 +183,7 @@ def monitor(pid: int,
|
|
178
183
|
|
179
184
|
setproctitle("parsl: task resource monitor")
|
180
185
|
|
181
|
-
radio
|
182
|
-
if radio_mode == "udp":
|
183
|
-
radio = UDPRadio(monitoring_hub_url,
|
184
|
-
source_id=task_id)
|
185
|
-
elif radio_mode == "htex":
|
186
|
-
radio = HTEXRadio(monitoring_hub_url,
|
187
|
-
source_id=task_id)
|
188
|
-
elif radio_mode == "filesystem":
|
189
|
-
radio = FilesystemRadio(monitoring_url=monitoring_hub_url,
|
190
|
-
source_id=task_id, run_dir=run_dir)
|
191
|
-
else:
|
192
|
-
raise RuntimeError(f"Unknown radio mode: {radio_mode}")
|
186
|
+
radio = get_radio(radio_mode, monitoring_hub_url, task_id, run_dir)
|
193
187
|
|
194
188
|
logging.debug("start of monitor")
|
195
189
|
|
@@ -206,7 +206,7 @@ class LocalProvider(ExecutionProvider, RepresentationMixin):
|
|
206
206
|
script_path = "{0}/{1}.sh".format(self.script_dir, job_name)
|
207
207
|
script_path = os.path.abspath(script_path)
|
208
208
|
|
209
|
-
wrap_command = self.worker_init + f'\nexport JOBNAME
|
209
|
+
wrap_command = self.worker_init + f'\nexport JOBNAME={job_name}\n' + self.launcher(command, tasks_per_node, self.nodes_per_block)
|
210
210
|
|
211
211
|
self._write_submit_script(wrap_command, script_path)
|
212
212
|
|
@@ -0,0 +1,33 @@
|
|
1
|
+
import pytest
|
2
|
+
|
3
|
+
from parsl import Config
|
4
|
+
from parsl.executors import HighThroughputExecutor
|
5
|
+
from parsl.launchers import SrunLauncher, AprunLauncher, SimpleLauncher
|
6
|
+
from parsl.providers import SlurmProvider
|
7
|
+
|
8
|
+
|
9
|
+
@pytest.mark.local
|
10
|
+
def test_bad_launcher_with_mpi_mode():
|
11
|
+
"""AssertionError if a launcher other than SimpleLauncher is supplied"""
|
12
|
+
|
13
|
+
for launcher in [SrunLauncher(), AprunLauncher()]:
|
14
|
+
with pytest.raises(AssertionError):
|
15
|
+
Config(executors=[
|
16
|
+
HighThroughputExecutor(
|
17
|
+
enable_mpi_mode=True,
|
18
|
+
provider=SlurmProvider(launcher=launcher),
|
19
|
+
)
|
20
|
+
])
|
21
|
+
|
22
|
+
|
23
|
+
@pytest.mark.local
|
24
|
+
def test_correct_launcher_with_mpi_mode():
|
25
|
+
"""Confirm that SimpleLauncher works with mpi_mode"""
|
26
|
+
|
27
|
+
config = Config(executors=[
|
28
|
+
HighThroughputExecutor(
|
29
|
+
enable_mpi_mode=True,
|
30
|
+
provider=SlurmProvider(launcher=SimpleLauncher()),
|
31
|
+
)
|
32
|
+
])
|
33
|
+
assert isinstance(config.executors[0].provider.launcher, SimpleLauncher)
|