parsl 2025.1.6__tar.gz → 2025.1.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-2025.1.6/parsl.egg-info → parsl-2025.1.20}/PKG-INFO +3 -2
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/app/errors.py +3 -6
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/app/futures.py +6 -8
- parsl-2025.1.20/parsl/configs/gc_multisite.py +27 -0
- parsl-2025.1.20/parsl/configs/gc_tutorial.py +18 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/dataflow/dflow.py +17 -22
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/dataflow/errors.py +1 -4
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/dataflow/rundirs.py +4 -5
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/dataflow/taskrecord.py +1 -3
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/__init__.py +3 -1
- parsl-2025.1.20/parsl/executors/globus_compute.py +125 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/high_throughput/errors.py +2 -5
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/high_throughput/executor.py +2 -4
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/high_throughput/zmq_pipes.py +0 -1
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/taskvine/executor.py +0 -6
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/taskvine/factory_config.py +1 -1
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/taskvine/manager_config.py +2 -2
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/workqueue/executor.py +0 -6
- parsl-2025.1.20/parsl/tests/configs/globus_compute.py +20 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/conftest.py +4 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_error_handling/test_resource_spec.py +3 -0
- parsl-2025.1.20/parsl/tests/test_htex/test_interchange_exit_bad_registration.py +120 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_htex/test_resource_spec_validation.py +0 -7
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_python_apps/test_dep_standard_futures.py +3 -0
- parsl-2025.1.20/parsl/tests/test_python_apps/test_fail.py +52 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_python_apps/test_join.py +6 -0
- parsl-2025.1.20/parsl/tests/unit/test_globus_compute_executor.py +104 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/usage_tracking/usage.py +13 -8
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/version.py +1 -1
- {parsl-2025.1.6 → parsl-2025.1.20/parsl.egg-info}/PKG-INFO +3 -2
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl.egg-info/SOURCES.txt +6 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl.egg-info/requires.txt +6 -2
- {parsl-2025.1.6 → parsl-2025.1.20}/setup.py +6 -1
- parsl-2025.1.6/parsl/tests/test_python_apps/test_fail.py +0 -68
- {parsl-2025.1.6 → parsl-2025.1.20}/LICENSE +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/MANIFEST.in +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/README.rst +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/addresses.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/app/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/app/app.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/app/bash.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/app/python.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/benchmark/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/benchmark/perf.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/concurrent/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/config.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/configs/ASPIRE1.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/configs/Azure.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/configs/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/configs/bridges.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/configs/cc_in2p3.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/configs/ec2.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/configs/expanse.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/configs/frontera.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/configs/htex_local.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/configs/illinoiscluster.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/configs/improv.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/configs/kubernetes.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/configs/local_threads.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/configs/midway.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/configs/osg.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/configs/polaris.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/configs/stampede2.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/configs/summit.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/configs/toss3_llnl.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/configs/vineex_local.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/configs/wqex_local.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/curvezmq.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/data_provider/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/data_provider/data_manager.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/data_provider/file_noop.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/data_provider/files.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/data_provider/ftp.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/data_provider/globus.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/data_provider/http.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/data_provider/rsync.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/data_provider/staging.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/data_provider/zip.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/dataflow/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/dataflow/dependency_resolvers.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/dataflow/futures.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/dataflow/memoization.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/dataflow/states.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/errors.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/base.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/errors.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/execute_task.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/flux/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/flux/execute_parsl_task.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/flux/executor.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/flux/flux_instance_manager.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/high_throughput/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/high_throughput/interchange.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/high_throughput/manager_record.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/high_throughput/manager_selector.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/high_throughput/monitoring_info.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/high_throughput/mpi_executor.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/high_throughput/mpi_prefix_composer.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/high_throughput/mpi_resource_management.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/high_throughput/probe.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/high_throughput/process_worker_pool.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/radical/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/radical/executor.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/radical/rpex_resources.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/radical/rpex_worker.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/status_handling.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/taskvine/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/taskvine/errors.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/taskvine/exec_parsl_function.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/taskvine/factory.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/taskvine/manager.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/taskvine/utils.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/threads.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/workqueue/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/workqueue/errors.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/workqueue/exec_parsl_function.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/workqueue/parsl_coprocess.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/jobs/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/jobs/error_handlers.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/jobs/errors.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/jobs/job_status_poller.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/jobs/states.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/jobs/strategy.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/launchers/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/launchers/base.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/launchers/errors.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/launchers/launchers.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/log_utils.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/db_manager.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/errors.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/message_type.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/monitoring.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/queries/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/queries/pandas.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/radios/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/radios/base.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/radios/filesystem.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/radios/htex.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/radios/multiprocessing.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/radios/udp.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/radios/zmq.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/remote.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/router.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/types.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/visualization/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/visualization/app.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/visualization/models.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/visualization/plots/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/visualization/plots/default/workflow_plots.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/visualization/templates/app.html +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/visualization/templates/dag.html +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/visualization/templates/error.html +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/visualization/templates/layout.html +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/visualization/templates/task.html +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/visualization/templates/workflow.html +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/visualization/utils.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/visualization/version.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/monitoring/visualization/views.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/multiprocessing.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/process_loggers.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/providers/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/providers/aws/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/providers/aws/aws.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/providers/aws/template.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/providers/azure/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/providers/azure/azure.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/providers/azure/template.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/providers/base.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/providers/cluster_provider.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/providers/condor/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/providers/condor/condor.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/providers/condor/template.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/providers/errors.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/providers/googlecloud/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/providers/googlecloud/googlecloud.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/providers/grid_engine/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/providers/grid_engine/grid_engine.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/providers/grid_engine/template.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/providers/kubernetes/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/providers/kubernetes/kube.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/providers/kubernetes/template.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/providers/local/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/providers/local/local.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/providers/lsf/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/providers/lsf/lsf.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/providers/lsf/template.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/providers/pbspro/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/providers/pbspro/pbspro.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/providers/pbspro/template.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/providers/slurm/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/providers/slurm/slurm.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/providers/slurm/template.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/providers/torque/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/providers/torque/template.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/providers/torque/torque.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/py.typed +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/serialize/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/serialize/base.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/serialize/concretes.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/serialize/errors.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/serialize/facade.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/serialize/proxystore.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/callables_helper.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/configs/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/configs/azure_single_node.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/configs/bluewaters.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/configs/bridges.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/configs/cc_in2p3.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/configs/comet.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/configs/ec2_single_node.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/configs/ec2_spot.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/configs/flux_local.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/configs/frontera.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/configs/htex_local.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/configs/htex_local_alternate.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/configs/htex_local_intask_staging.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/configs/htex_local_rsync_staging.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/configs/local_radical.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/configs/local_radical_mpi.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/configs/local_threads.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/configs/local_threads_checkpoint_periodic.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/configs/local_threads_globus.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/configs/local_threads_monitoring.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/configs/local_threads_no_cache.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/configs/midway.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/configs/nscc_singapore.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/configs/osg_htex.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/configs/petrelkube.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/configs/slurm_local.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/configs/summit.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/configs/taskvine_ex.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/configs/user_opts.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/configs/workqueue_ex.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/integration/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/integration/latency.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/integration/test_apps/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/integration/test_stress/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/manual_tests/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/manual_tests/htex_local.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/manual_tests/test_basic.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/manual_tests/test_log_filter.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/manual_tests/test_memory_limits.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/manual_tests/test_regression_220.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/manual_tests/test_udp_simple.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/manual_tests/test_worker_count.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/scaling_tests/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/scaling_tests/htex_local.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/scaling_tests/local_threads.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/scaling_tests/test_scale.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/scaling_tests/vineex_condor.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/scaling_tests/vineex_local.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/scaling_tests/wqex_condor.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/scaling_tests/wqex_local.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/site_tests/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/site_tests/site_config_selector.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/site_tests/test_provider.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/site_tests/test_site.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/sites/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/sites/test_affinity.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/sites/test_concurrent.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/sites/test_dynamic_executor.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/sites/test_ec2.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/sites/test_launchers.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/sites/test_mpi/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/sites/test_worker_info.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_aalst_patterns.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_bash_apps/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_bash_apps/test_basic.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_bash_apps/test_inputs_default.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_bash_apps/test_memoize.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_bash_apps/test_multiline.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_bash_apps/test_pipeline.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_bash_apps/test_std_uri.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_bash_apps/test_stdout.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_callables.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_checkpointing/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_checkpointing/test_periodic.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_checkpointing/test_python_checkpoint_3.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_checkpointing/test_regression_233.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_checkpointing/test_task_exit.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_curvezmq.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_docs/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_docs/test_from_slides.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_docs/test_kwargs.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_docs/test_workflow1.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_docs/test_workflow2.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_docs/test_workflow4.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_error_handling/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_error_handling/test_fail.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_error_handling/test_python_walltime.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_error_handling/test_rand_fail.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_error_handling/test_retries.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_execute_task.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_flowcontrol/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_flux.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_htex/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_htex/test_basic.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_htex/test_block_manager_selector_unit.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_htex/test_command_client_timeout.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_htex/test_connected_blocks.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_htex/test_cpu_affinity_explicit.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_htex/test_disconnected_blocks.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_htex/test_disconnected_blocks_failing_provider.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_htex/test_drain.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_htex/test_htex.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_htex/test_manager_failure.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_htex/test_manager_selector_by_block.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_htex/test_managers_command.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_htex/test_missing_worker.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_htex/test_multiple_disconnected_blocks.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_htex/test_worker_failure.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_htex/test_zmq_binding.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_monitoring/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_monitoring/test_app_names.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_monitoring/test_basic.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_monitoring/test_fuzz_zmq.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_monitoring/test_incomplete_futures.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_monitoring/test_memoization_representation.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_monitoring/test_stdouterr.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_mpi_apps/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_mpi_apps/test_bad_mpi_config.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_mpi_apps/test_mpi_prefix.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_mpi_apps/test_mpi_scheduler.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_mpi_apps/test_mpiex.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_mpi_apps/test_resource_spec.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_providers/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_providers/test_kubernetes_provider.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_providers/test_local_provider.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_providers/test_pbspro_template.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_providers/test_slurm_instantiate.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_providers/test_slurm_template.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_providers/test_submiterror_deprecation.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_python_apps/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_python_apps/test_basic.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_python_apps/test_context_manager.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_python_apps/test_dependencies_deep.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_python_apps/test_depfail_propagation.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_python_apps/test_futures.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_python_apps/test_garbage_collect.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_python_apps/test_inputs_default.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_python_apps/test_lifted.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_python_apps/test_mapred.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_python_apps/test_memoize_2.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_python_apps/test_outputs.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_python_apps/test_overview.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_python_apps/test_pipeline.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_python_apps/test_pluggable_future_resolution.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_python_apps/test_simple.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_python_apps/test_timeout.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_python_apps/test_type5.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_radical/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_radical/test_mpi_funcs.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_regression/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_regression/test_1480.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_regression/test_1653.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_regression/test_221.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_regression/test_226.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_regression/test_2652.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_regression/test_69a.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_regression/test_854.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_regression/test_97_parallelism_0.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_regression/test_98.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_scaling/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_scaling/test_block_error_handler.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_scaling/test_regression_1621.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_scaling/test_regression_3568_scaledown_vs_MISSING.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_scaling/test_regression_3696_oscillation.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_scaling/test_scale_down.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_scaling/test_shutdown_scalein.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_scaling/test_worker_interchange_bad_messages_3262.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_serialization/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_serialization/test_2555_caching_deserializer.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_serialization/test_3495_deserialize_managerlost.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_serialization/test_basic.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_serialization/test_htex_code_cache.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_serialization/test_pack_resource_spec.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_serialization/test_proxystore_configured.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_serialization/test_proxystore_impl.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_shutdown/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_shutdown/test_kill_monitoring.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_staging/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_staging/staging_provider.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_staging/test_1316.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_staging/test_docs_1.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_staging/test_docs_2.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_staging/test_file.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_staging/test_file_apps.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_staging/test_file_staging.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_staging/test_output_chain_filenames.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_staging/test_staging_globus.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_staging/test_staging_https.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_staging/test_staging_stdout.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_staging/test_zip_in.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_staging/test_zip_out.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_staging/test_zip_to_zip.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_summary.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_thread_parallelism.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_threads/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_threads/test_configs.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_utils/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_utils/test_execute_wait.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_utils/test_representation_mixin.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/test_utils/test_sanitize_dns.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/unit/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/unit/test_address.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/unit/test_file.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/unit/test_usage_tracking.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/tests/utils.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/usage_tracking/__init__.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/usage_tracking/api.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/usage_tracking/levels.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl/utils.py +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl.egg-info/dependency_links.txt +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl.egg-info/entry_points.txt +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/parsl.egg-info/top_level.txt +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/requirements.txt +0 -0
- {parsl-2025.1.6 → parsl-2025.1.20}/setup.cfg +0 -0
@@ -1,9 +1,9 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: parsl
|
3
|
-
Version: 2025.1.
|
3
|
+
Version: 2025.1.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/2025.01.
|
6
|
+
Download-URL: https://github.com/Parsl/parsl/archive/2025.01.20.tar.gz
|
7
7
|
Author: The Parsl Team
|
8
8
|
Author-email: parsl@googlegroups.com
|
9
9
|
License: Apache 2.0
|
@@ -28,6 +28,7 @@ Provides-Extra: workqueue
|
|
28
28
|
Provides-Extra: flux
|
29
29
|
Provides-Extra: proxystore
|
30
30
|
Provides-Extra: radical-pilot
|
31
|
+
Provides-Extra: globus_compute
|
31
32
|
Provides-Extra: all
|
32
33
|
License-File: LICENSE
|
33
34
|
|
@@ -70,8 +70,8 @@ class MissingOutputs(ParslError):
|
|
70
70
|
self.reason = reason
|
71
71
|
self.outputs = outputs
|
72
72
|
|
73
|
-
def
|
74
|
-
return "Missing Outputs: {0}, Reason:{1}".format(self.outputs, self.reason)
|
73
|
+
def __str__(self) -> str:
|
74
|
+
return "Missing Outputs: {0}, Reason: {1}".format(self.outputs, self.reason)
|
75
75
|
|
76
76
|
|
77
77
|
class BadStdStreamFile(ParslError):
|
@@ -85,11 +85,8 @@ class BadStdStreamFile(ParslError):
|
|
85
85
|
super().__init__(reason)
|
86
86
|
self._reason = reason
|
87
87
|
|
88
|
-
def __repr__(self) -> str:
|
89
|
-
return "Bad Stream File: {}".format(self._reason)
|
90
|
-
|
91
88
|
def __str__(self) -> str:
|
92
|
-
return self.
|
89
|
+
return "Bad Stream File: {}".format(self._reason)
|
93
90
|
|
94
91
|
|
95
92
|
class RemoteExceptionWrapper:
|
@@ -2,7 +2,6 @@
|
|
2
2
|
"""
|
3
3
|
import logging
|
4
4
|
from concurrent.futures import Future
|
5
|
-
from typing import Optional
|
6
5
|
|
7
6
|
import typeguard
|
8
7
|
|
@@ -39,24 +38,23 @@ class DataFuture(Future):
|
|
39
38
|
self.set_result(self.file_obj)
|
40
39
|
|
41
40
|
@typeguard.typechecked
|
42
|
-
def __init__(self, fut: Future, file_obj: File, tid:
|
41
|
+
def __init__(self, fut: Future, file_obj: File, tid: int) -> None:
|
43
42
|
"""Construct the DataFuture object.
|
44
43
|
|
45
44
|
If the file_obj is a string convert to a File.
|
46
45
|
|
47
46
|
Args:
|
48
|
-
- fut (
|
49
|
-
|
47
|
+
- fut (Future) : Future that this DataFuture will track.
|
48
|
+
Completion of ``fut`` indicates that the data is
|
49
|
+
ready.
|
50
|
+
- file_obj (File) : File that this DataFuture represents the availability of
|
50
51
|
|
51
52
|
Kwargs:
|
52
53
|
- tid (task_id) : Task id that this DataFuture tracks
|
53
54
|
"""
|
54
55
|
super().__init__()
|
55
56
|
self._tid = tid
|
56
|
-
|
57
|
-
self.file_obj = file_obj
|
58
|
-
else:
|
59
|
-
raise ValueError("DataFuture must be initialized with a File, not {}".format(type(file_obj)))
|
57
|
+
self.file_obj = file_obj
|
60
58
|
self.parent = fut
|
61
59
|
|
62
60
|
self.parent.add_done_callback(self.parent_callback)
|
@@ -0,0 +1,27 @@
|
|
1
|
+
from globus_compute_sdk import Executor
|
2
|
+
|
3
|
+
from parsl.config import Config
|
4
|
+
from parsl.executors import GlobusComputeExecutor
|
5
|
+
from parsl.usage_tracking.levels import LEVEL_1
|
6
|
+
|
7
|
+
# Please start your own endpoint on perlmutter following instructions below to use this config:
|
8
|
+
# https://globus-compute.readthedocs.io/en/stable/endpoints/endpoint_examples.html#perlmutter-nersc
|
9
|
+
perlmutter_endpoint = 'YOUR_PERLMUTTER_ENDPOINT_UUID'
|
10
|
+
|
11
|
+
# Please start your own endpoint on expanse following instructions below to use this config:
|
12
|
+
# https://globus-compute.readthedocs.io/en/stable/endpoints/endpoint_examples.html#expanse-sdsc
|
13
|
+
expanse_endpoint = 'YOUR_EXPANSE_ENDPOINT_UUID'
|
14
|
+
|
15
|
+
config = Config(
|
16
|
+
executors=[
|
17
|
+
GlobusComputeExecutor(
|
18
|
+
executor=Executor(endpoint_id=perlmutter_endpoint),
|
19
|
+
label="Perlmutter",
|
20
|
+
),
|
21
|
+
GlobusComputeExecutor(
|
22
|
+
executor=Executor(endpoint_id=expanse_endpoint),
|
23
|
+
label="Expanse",
|
24
|
+
),
|
25
|
+
],
|
26
|
+
usage_tracking=LEVEL_1,
|
27
|
+
)
|
@@ -0,0 +1,18 @@
|
|
1
|
+
from globus_compute_sdk import Executor
|
2
|
+
|
3
|
+
from parsl.config import Config
|
4
|
+
from parsl.executors import GlobusComputeExecutor
|
5
|
+
from parsl.usage_tracking.levels import LEVEL_1
|
6
|
+
|
7
|
+
# Public tutorial endpoint
|
8
|
+
tutorial_endpoint = '4b116d3c-1703-4f8f-9f6f-39921e5864df'
|
9
|
+
|
10
|
+
config = Config(
|
11
|
+
executors=[
|
12
|
+
GlobusComputeExecutor(
|
13
|
+
executor=Executor(endpoint_id=tutorial_endpoint),
|
14
|
+
label="Tutorial_Endpoint_py3.11",
|
15
|
+
)
|
16
|
+
],
|
17
|
+
usage_tracking=LEVEL_1,
|
18
|
+
)
|
@@ -484,24 +484,18 @@ class DataFlowKernel:
|
|
484
484
|
|
485
485
|
# now we know each joinable Future is done
|
486
486
|
# so now look for any exceptions
|
487
|
-
exceptions_tids: List[Tuple[BaseException,
|
487
|
+
exceptions_tids: List[Tuple[BaseException, str]]
|
488
488
|
exceptions_tids = []
|
489
489
|
if isinstance(joinable, Future):
|
490
490
|
je = joinable.exception()
|
491
491
|
if je is not None:
|
492
|
-
|
493
|
-
tid = joinable.task_record['id']
|
494
|
-
else:
|
495
|
-
tid = None
|
492
|
+
tid = self.render_future_description(joinable)
|
496
493
|
exceptions_tids = [(je, tid)]
|
497
494
|
elif isinstance(joinable, list):
|
498
495
|
for future in joinable:
|
499
496
|
je = future.exception()
|
500
497
|
if je is not None:
|
501
|
-
|
502
|
-
tid = joinable.task_record['id']
|
503
|
-
else:
|
504
|
-
tid = None
|
498
|
+
tid = self.render_future_description(future)
|
505
499
|
exceptions_tids.append((je, tid))
|
506
500
|
else:
|
507
501
|
raise TypeError(f"Unknown joinable type {type(joinable)}")
|
@@ -918,13 +912,7 @@ class DataFlowKernel:
|
|
918
912
|
dep_failures = []
|
919
913
|
|
920
914
|
def append_failure(e: Exception, dep: Future) -> None:
|
921
|
-
|
922
|
-
# then refer to the task ID.
|
923
|
-
# Otherwise make a repr of the Future object.
|
924
|
-
if hasattr(dep, 'task_record') and dep.task_record['dfk'] == self:
|
925
|
-
tid = "task " + repr(dep.task_record['id'])
|
926
|
-
else:
|
927
|
-
tid = repr(dep)
|
915
|
+
tid = self.render_future_description(dep)
|
928
916
|
dep_failures.extend([(e, tid)])
|
929
917
|
|
930
918
|
# Replace item in args
|
@@ -1076,10 +1064,7 @@ class DataFlowKernel:
|
|
1076
1064
|
|
1077
1065
|
depend_descs = []
|
1078
1066
|
for d in depends:
|
1079
|
-
|
1080
|
-
depend_descs.append("task {}".format(d.tid))
|
1081
|
-
else:
|
1082
|
-
depend_descs.append(repr(d))
|
1067
|
+
depend_descs.append(self.render_future_description(d))
|
1083
1068
|
|
1084
1069
|
if depend_descs != []:
|
1085
1070
|
waiting_message = "waiting on {}".format(", ".join(depend_descs))
|
@@ -1215,10 +1200,8 @@ class DataFlowKernel:
|
|
1215
1200
|
self._checkpoint_timer.close()
|
1216
1201
|
|
1217
1202
|
# Send final stats
|
1218
|
-
logger.info("Sending end message for usage tracking")
|
1219
1203
|
self.usage_tracker.send_end_message()
|
1220
1204
|
self.usage_tracker.close()
|
1221
|
-
logger.info("Closed usage tracking")
|
1222
1205
|
|
1223
1206
|
logger.info("Closing job status poller")
|
1224
1207
|
self.job_status_poller.close()
|
@@ -1438,6 +1421,18 @@ class DataFlowKernel:
|
|
1438
1421
|
'' if label is None else '_{}'.format(label),
|
1439
1422
|
kw))
|
1440
1423
|
|
1424
|
+
def render_future_description(self, dep: Future) -> str:
|
1425
|
+
"""Renders a description of the future in the context of the
|
1426
|
+
current DFK.
|
1427
|
+
"""
|
1428
|
+
if isinstance(dep, AppFuture) and dep.task_record['dfk'] == self:
|
1429
|
+
tid = "task " + repr(dep.task_record['id'])
|
1430
|
+
elif isinstance(dep, DataFuture):
|
1431
|
+
tid = "DataFuture from task " + repr(dep.tid)
|
1432
|
+
else:
|
1433
|
+
tid = repr(dep)
|
1434
|
+
return tid
|
1435
|
+
|
1441
1436
|
|
1442
1437
|
class DataFlowKernelLoader:
|
1443
1438
|
"""Manage which DataFlowKernel is active.
|
@@ -25,11 +25,8 @@ class BadCheckpoint(DataFlowException):
|
|
25
25
|
def __init__(self, reason: str) -> None:
|
26
26
|
self.reason = reason
|
27
27
|
|
28
|
-
def __repr__(self) -> str:
|
29
|
-
return self.reason
|
30
|
-
|
31
28
|
def __str__(self) -> str:
|
32
|
-
return self.
|
29
|
+
return self.reason
|
33
30
|
|
34
31
|
|
35
32
|
class DependencyError(DataFlowException):
|
@@ -6,17 +6,16 @@ logger = logging.getLogger(__name__)
|
|
6
6
|
|
7
7
|
|
8
8
|
def make_rundir(path: str) -> str:
|
9
|
-
"""
|
9
|
+
"""Create a numbered run directory under the specified path.
|
10
10
|
|
11
|
-
|
12
|
-
./runinfo <- Home of all run directories
|
11
|
+
./runinfo <- specified path
|
13
12
|
|----000
|
14
13
|
|----001 <- Directories for each run
|
15
14
|
| ....
|
16
15
|
|----NNN
|
17
16
|
|
18
|
-
|
19
|
-
- path (str): String path to
|
17
|
+
Args:
|
18
|
+
- path (str): String path to root of all rundirs
|
20
19
|
"""
|
21
20
|
try:
|
22
21
|
if not os.path.exists(path):
|
@@ -43,12 +43,11 @@ class TaskRecord(TypedDict, total=False):
|
|
43
43
|
executed on.
|
44
44
|
"""
|
45
45
|
|
46
|
-
retries_left: int
|
47
46
|
fail_count: int
|
48
47
|
fail_cost: float
|
49
48
|
fail_history: List[str]
|
50
49
|
|
51
|
-
checkpoint: bool
|
50
|
+
checkpoint: bool
|
52
51
|
"""Should this task be checkpointed?
|
53
52
|
"""
|
54
53
|
|
@@ -68,7 +67,6 @@ class TaskRecord(TypedDict, total=False):
|
|
68
67
|
|
69
68
|
# these three could be more strongly typed perhaps but I'm not thinking about that now
|
70
69
|
func: Callable
|
71
|
-
fn_hash: str
|
72
70
|
args: Sequence[Any]
|
73
71
|
# in some places we uses a Tuple[Any, ...] and in some places a List[Any].
|
74
72
|
# This is an attempt to correctly type both of those.
|
@@ -1,4 +1,5 @@
|
|
1
1
|
from parsl.executors.flux.executor import FluxExecutor
|
2
|
+
from parsl.executors.globus_compute import GlobusComputeExecutor
|
2
3
|
from parsl.executors.high_throughput.executor import HighThroughputExecutor
|
3
4
|
from parsl.executors.high_throughput.mpi_executor import MPIExecutor
|
4
5
|
from parsl.executors.threads import ThreadPoolExecutor
|
@@ -8,4 +9,5 @@ __all__ = ['ThreadPoolExecutor',
|
|
8
9
|
'HighThroughputExecutor',
|
9
10
|
'MPIExecutor',
|
10
11
|
'WorkQueueExecutor',
|
11
|
-
'FluxExecutor'
|
12
|
+
'FluxExecutor',
|
13
|
+
'GlobusComputeExecutor']
|
@@ -0,0 +1,125 @@
|
|
1
|
+
from __future__ import annotations
|
2
|
+
|
3
|
+
import copy
|
4
|
+
from concurrent.futures import Future
|
5
|
+
from typing import Any, Callable, Dict
|
6
|
+
|
7
|
+
import typeguard
|
8
|
+
|
9
|
+
from parsl.errors import OptionalModuleMissing
|
10
|
+
from parsl.executors.base import ParslExecutor
|
11
|
+
from parsl.utils import RepresentationMixin
|
12
|
+
|
13
|
+
try:
|
14
|
+
from globus_compute_sdk import Executor
|
15
|
+
_globus_compute_enabled = True
|
16
|
+
except ImportError:
|
17
|
+
_globus_compute_enabled = False
|
18
|
+
|
19
|
+
|
20
|
+
class GlobusComputeExecutor(ParslExecutor, RepresentationMixin):
|
21
|
+
""" GlobusComputeExecutor enables remote execution on Globus Compute endpoints
|
22
|
+
|
23
|
+
GlobusComputeExecutor is a thin wrapper over globus_compute_sdk.Executor
|
24
|
+
Refer to `globus-compute user documentation <https://globus-compute.readthedocs.io/en/latest/executor.html>`_
|
25
|
+
and `reference documentation <https://globus-compute.readthedocs.io/en/latest/reference/executor.html>`_
|
26
|
+
for more details.
|
27
|
+
|
28
|
+
.. note::
|
29
|
+
As a remote execution system, Globus Compute relies on serialization to ship
|
30
|
+
tasks and results between the Parsl client side and the remote Globus Compute
|
31
|
+
Endpoint side. Serialization is unreliable across python versions, and
|
32
|
+
wrappers used by Parsl assume identical Parsl versions across on both sides.
|
33
|
+
We recommend using matching Python, Parsl and Globus Compute version on both
|
34
|
+
the client side and the endpoint side for stable behavior.
|
35
|
+
|
36
|
+
"""
|
37
|
+
|
38
|
+
@typeguard.typechecked
|
39
|
+
def __init__(
|
40
|
+
self,
|
41
|
+
executor: Executor,
|
42
|
+
label: str = 'GlobusComputeExecutor',
|
43
|
+
):
|
44
|
+
"""
|
45
|
+
Parameters
|
46
|
+
----------
|
47
|
+
|
48
|
+
executor: globus_compute_sdk.Executor
|
49
|
+
Pass a globus_compute_sdk Executor that will be used to execute
|
50
|
+
tasks on a globus_compute endpoint. Refer to `globus-compute docs
|
51
|
+
<https://globus-compute.readthedocs.io/en/latest/reference/executor.html#globus-compute-executor>`_
|
52
|
+
|
53
|
+
label:
|
54
|
+
a label to name the executor
|
55
|
+
"""
|
56
|
+
if not _globus_compute_enabled:
|
57
|
+
raise OptionalModuleMissing(
|
58
|
+
['globus-compute-sdk'],
|
59
|
+
"GlobusComputeExecutor requires globus-compute-sdk installed"
|
60
|
+
)
|
61
|
+
|
62
|
+
super().__init__()
|
63
|
+
self.executor: Executor = executor
|
64
|
+
self.resource_specification = self.executor.resource_specification
|
65
|
+
self.user_endpoint_config = self.executor.user_endpoint_config
|
66
|
+
self.label = label
|
67
|
+
|
68
|
+
def start(self) -> None:
|
69
|
+
""" Start the Globus Compute Executor """
|
70
|
+
pass
|
71
|
+
|
72
|
+
def submit(self, func: Callable, resource_specification: Dict[str, Any], *args: Any, **kwargs: Any) -> Future:
|
73
|
+
""" Submit func to globus-compute
|
74
|
+
|
75
|
+
|
76
|
+
Parameters
|
77
|
+
----------
|
78
|
+
|
79
|
+
func: Callable
|
80
|
+
Python function to execute remotely
|
81
|
+
|
82
|
+
resource_specification: Dict[str, Any]
|
83
|
+
Resource specification can be used specify MPI resources required by MPI applications on
|
84
|
+
Endpoints configured to use globus compute's MPIEngine. GCE also accepts *user_endpoint_config*
|
85
|
+
to configure endpoints when the endpoint is a `Multi-User Endpoint
|
86
|
+
<https://globus-compute.readthedocs.io/en/latest/endpoints/endpoints.html#templating-endpoint-configuration>`_
|
87
|
+
|
88
|
+
args:
|
89
|
+
Args to pass to the function
|
90
|
+
|
91
|
+
kwargs:
|
92
|
+
kwargs to pass to the function
|
93
|
+
|
94
|
+
Returns
|
95
|
+
-------
|
96
|
+
|
97
|
+
Future
|
98
|
+
"""
|
99
|
+
res_spec = copy.deepcopy(resource_specification or self.resource_specification)
|
100
|
+
# Pop user_endpoint_config since it is illegal in resource_spec for globus_compute
|
101
|
+
if res_spec:
|
102
|
+
user_endpoint_config = res_spec.pop('user_endpoint_config', self.user_endpoint_config)
|
103
|
+
else:
|
104
|
+
user_endpoint_config = self.user_endpoint_config
|
105
|
+
|
106
|
+
try:
|
107
|
+
self.executor.resource_specification = res_spec
|
108
|
+
self.executor.user_endpoint_config = user_endpoint_config
|
109
|
+
return self.executor.submit(func, *args, **kwargs)
|
110
|
+
finally:
|
111
|
+
# Reset executor state to defaults set at configuration time
|
112
|
+
self.executor.resource_specification = self.resource_specification
|
113
|
+
self.executor.user_endpoint_config = self.user_endpoint_config
|
114
|
+
|
115
|
+
def shutdown(self):
|
116
|
+
"""Clean-up the resources associated with the Executor.
|
117
|
+
|
118
|
+
GCE.shutdown will cancel all futures that have not yet registered with
|
119
|
+
Globus Compute and will not wait for the launched futures to complete.
|
120
|
+
This method explicitly shutsdown the result_watcher thread to avoid
|
121
|
+
it waiting for outstanding futures at thread exit.
|
122
|
+
"""
|
123
|
+
self.executor.shutdown(wait=False, cancel_futures=True)
|
124
|
+
result_watcher = self.executor._get_result_watcher()
|
125
|
+
result_watcher.shutdown(wait=False, cancel_futures=True)
|
@@ -27,7 +27,7 @@ class VersionMismatch(Exception):
|
|
27
27
|
def __str__(self) -> str:
|
28
28
|
return (
|
29
29
|
f"Manager version info {self.manager_version} does not match interchange"
|
30
|
-
f" version info {self.interchange_version}
|
30
|
+
f" version info {self.interchange_version}"
|
31
31
|
)
|
32
32
|
|
33
33
|
|
@@ -38,11 +38,8 @@ class WorkerLost(Exception):
|
|
38
38
|
self.worker_id = worker_id
|
39
39
|
self.hostname = hostname
|
40
40
|
|
41
|
-
def __repr__(self):
|
42
|
-
return "Task failure due to loss of worker {} on host {}".format(self.worker_id, self.hostname)
|
43
|
-
|
44
41
|
def __str__(self):
|
45
|
-
return self.
|
42
|
+
return "Task failure due to loss of worker {} on host {}".format(self.worker_id, self.hostname)
|
46
43
|
|
47
44
|
|
48
45
|
class CommandClientTimeoutError(Exception):
|
@@ -8,7 +8,7 @@ import warnings
|
|
8
8
|
from collections import defaultdict
|
9
9
|
from concurrent.futures import Future
|
10
10
|
from dataclasses import dataclass
|
11
|
-
from typing import Callable, Dict, List, Optional, Sequence, Tuple, Union
|
11
|
+
from typing import Callable, Dict, List, Optional, Sequence, Set, Tuple, Union
|
12
12
|
|
13
13
|
import typeguard
|
14
14
|
|
@@ -357,10 +357,8 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
|
|
357
357
|
return self.logdir
|
358
358
|
|
359
359
|
def validate_resource_spec(self, resource_specification: dict):
|
360
|
-
"""HTEX supports the following *Optional* resource specifications:
|
361
|
-
priority: lower value is higher priority"""
|
362
360
|
if resource_specification:
|
363
|
-
acceptable_fields =
|
361
|
+
acceptable_fields: Set[str] = set() # add new resource spec field names here to make htex accept them
|
364
362
|
keys = set(resource_specification.keys())
|
365
363
|
invalid_keys = keys - acceptable_fields
|
366
364
|
if invalid_keys:
|
@@ -213,7 +213,6 @@ class ResultsIncoming:
|
|
213
213
|
"""Get a message from the queue, returning None if timeout expires
|
214
214
|
without a message. timeout is measured in milliseconds.
|
215
215
|
"""
|
216
|
-
logger.debug("Waiting for ResultsIncoming message")
|
217
216
|
socks = dict(self.poller.poll(timeout=timeout_ms))
|
218
217
|
if self.results_receiver in socks and socks[self.results_receiver] == zmq.POLLIN:
|
219
218
|
m = self.results_receiver.recv_multipart()
|
@@ -582,12 +582,6 @@ class TaskVineExecutor(BlockProviderExecutor, putils.RepresentationMixin):
|
|
582
582
|
logger.debug("TaskVine shutdown started")
|
583
583
|
self._should_stop.set()
|
584
584
|
|
585
|
-
# Remove the workers that are still going
|
586
|
-
kill_ids = [self.blocks_to_job_id[block] for block in self.blocks_to_job_id.keys()]
|
587
|
-
if self.provider:
|
588
|
-
logger.debug("Cancelling blocks")
|
589
|
-
self.provider.cancel(kill_ids)
|
590
|
-
|
591
585
|
# Join all processes before exiting
|
592
586
|
logger.debug("Joining on submit process")
|
593
587
|
self._submit_process.join()
|
@@ -24,7 +24,7 @@ class TaskVineManagerConfig:
|
|
24
24
|
|
25
25
|
address: Optional[str]
|
26
26
|
Address of the local machine.
|
27
|
-
If None,
|
27
|
+
If None, :py:func:`parsl.addresses.get_any_address` will be used to determine the address.
|
28
28
|
|
29
29
|
project_name: Optional[str]
|
30
30
|
If given, TaskVine will periodically report its status and performance
|
@@ -56,7 +56,7 @@ class TaskVineManagerConfig:
|
|
56
56
|
environment name is given, TaskVine will package the conda
|
57
57
|
environment in a tarball and send it along with tasks to be
|
58
58
|
executed in a replicated conda environment.
|
59
|
-
If a tarball of packages (
|
59
|
+
If a tarball of packages (``*.tar.gz``) is given, TaskVine
|
60
60
|
skips the packaging step and sends the tarball along with
|
61
61
|
tasks to be executed in a replicated conda environment.
|
62
62
|
|
@@ -697,12 +697,6 @@ class WorkQueueExecutor(BlockProviderExecutor, putils.RepresentationMixin):
|
|
697
697
|
logger.debug("Work Queue shutdown started")
|
698
698
|
self.should_stop.value = True
|
699
699
|
|
700
|
-
# Remove the workers that are still going
|
701
|
-
kill_ids = [self.blocks_to_job_id[block] for block in self.blocks_to_job_id.keys()]
|
702
|
-
if self.provider:
|
703
|
-
logger.debug("Cancelling blocks")
|
704
|
-
self.provider.cancel(kill_ids)
|
705
|
-
|
706
700
|
logger.debug("Joining on submit process")
|
707
701
|
self.submit_process.join()
|
708
702
|
self.submit_process.close()
|
@@ -0,0 +1,20 @@
|
|
1
|
+
import os
|
2
|
+
|
3
|
+
from globus_compute_sdk import Executor
|
4
|
+
|
5
|
+
from parsl.config import Config
|
6
|
+
from parsl.executors import GlobusComputeExecutor
|
7
|
+
|
8
|
+
|
9
|
+
def fresh_config():
|
10
|
+
|
11
|
+
endpoint_id = os.environ["GLOBUS_COMPUTE_ENDPOINT"]
|
12
|
+
|
13
|
+
return Config(
|
14
|
+
executors=[
|
15
|
+
GlobusComputeExecutor(
|
16
|
+
executor=Executor(endpoint_id=endpoint_id),
|
17
|
+
label="globus_compute",
|
18
|
+
)
|
19
|
+
]
|
20
|
+
)
|
@@ -163,6 +163,10 @@ def pytest_configure(config):
|
|
163
163
|
'markers',
|
164
164
|
'shared_fs: Marks tests that require a shared_fs between the workers are the test client'
|
165
165
|
)
|
166
|
+
config.addinivalue_line(
|
167
|
+
'markers',
|
168
|
+
'issue_3620: Marks tests that do not work correctly on GlobusComputeExecutor (ref: issue 3620)'
|
169
|
+
)
|
166
170
|
|
167
171
|
|
168
172
|
@pytest.fixture(autouse=True, scope='session')
|
@@ -1,3 +1,5 @@
|
|
1
|
+
import pytest
|
2
|
+
|
1
3
|
import parsl
|
2
4
|
from parsl.app.app import python_app
|
3
5
|
from parsl.executors import WorkQueueExecutor
|
@@ -11,6 +13,7 @@ def double(x, parsl_resource_specification={}):
|
|
11
13
|
return x * 2
|
12
14
|
|
13
15
|
|
16
|
+
@pytest.mark.issue_3620
|
14
17
|
def test_resource(n=2):
|
15
18
|
executors = parsl.dfk().executors
|
16
19
|
executor = None
|