parsl 2025.9.22__tar.gz → 2025.10.6__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.
Potentially problematic release.
This version of parsl might be problematic. Click here for more details.
- {parsl-2025.9.22/parsl.egg-info → parsl-2025.10.6}/PKG-INFO +3 -4
- {parsl-2025.9.22 → parsl-2025.10.6}/README.rst +5 -2
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/benchmark/perf.py +22 -9
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/dataflow/dflow.py +6 -4
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/dataflow/memoization.py +9 -19
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/high_throughput/executor.py +76 -20
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/high_throughput/interchange.py +4 -3
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/high_throughput/mpi_executor.py +1 -2
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/high_throughput/mpi_resource_management.py +3 -4
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/high_throughput/process_worker_pool.py +25 -4
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/high_throughput/zmq_pipes.py +7 -24
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/taskvine/executor.py +5 -1
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/taskvine_ex.py +1 -1
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_checkpointing/test_periodic.py +15 -9
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_checkpointing/test_regression_233.py +0 -1
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_htex.py +36 -1
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_interchange_exit_bad_registration.py +0 -1
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_mpi_apps/test_mpi_scheduler.py +12 -12
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_garbage_collect.py +1 -6
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_memoize_2.py +11 -1
- parsl-2025.10.6/parsl/tests/test_regression/test_3874.py +47 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/version.py +1 -1
- {parsl-2025.9.22 → parsl-2025.10.6/parsl.egg-info}/PKG-INFO +3 -4
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl.egg-info/SOURCES.txt +1 -2
- {parsl-2025.9.22 → parsl-2025.10.6}/setup.py +1 -2
- parsl-2025.9.22/parsl/tests/configs/local_threads_checkpoint_periodic.py +0 -11
- parsl-2025.9.22/parsl/tests/configs/local_threads_no_cache.py +0 -11
- {parsl-2025.9.22 → parsl-2025.10.6}/LICENSE +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/MANIFEST.in +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/addresses.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/app/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/app/app.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/app/bash.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/app/errors.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/app/futures.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/app/python.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/benchmark/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/concurrent/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/config.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/ASPIRE1.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/Azure.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/anvil.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/bridges.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/cc_in2p3.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/delta.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/ec2.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/expanse.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/frontera.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/gc_multisite.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/gc_tutorial.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/htex_local.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/illinoiscluster.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/improv.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/kubernetes.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/local_threads.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/midway.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/osg.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/polaris.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/stampede2.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/summit.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/toss3_llnl.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/vineex_local.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/wqex_local.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/curvezmq.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/data_provider/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/data_provider/data_manager.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/data_provider/file_noop.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/data_provider/files.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/data_provider/ftp.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/data_provider/globus.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/data_provider/http.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/data_provider/rsync.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/data_provider/staging.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/data_provider/zip.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/dataflow/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/dataflow/dependency_resolvers.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/dataflow/errors.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/dataflow/futures.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/dataflow/rundirs.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/dataflow/states.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/dataflow/taskrecord.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/errors.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/base.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/errors.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/execute_task.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/flux/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/flux/execute_parsl_task.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/flux/executor.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/flux/flux_instance_manager.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/globus_compute.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/high_throughput/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/high_throughput/errors.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/high_throughput/manager_record.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/high_throughput/manager_selector.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/high_throughput/monitoring_info.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/high_throughput/mpi_prefix_composer.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/high_throughput/probe.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/radical/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/radical/executor.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/radical/rpex_resources.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/radical/rpex_worker.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/status_handling.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/taskvine/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/taskvine/errors.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/taskvine/exec_parsl_function.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/taskvine/factory.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/taskvine/factory_config.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/taskvine/manager.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/taskvine/manager_config.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/taskvine/utils.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/threads.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/workqueue/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/workqueue/errors.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/workqueue/exec_parsl_function.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/workqueue/executor.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/workqueue/parsl_coprocess.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/jobs/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/jobs/error_handlers.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/jobs/errors.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/jobs/job_status_poller.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/jobs/states.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/jobs/strategy.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/launchers/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/launchers/base.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/launchers/errors.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/launchers/launchers.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/log_utils.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/db_manager.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/errors.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/message_type.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/monitoring.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/queries/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/queries/pandas.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/radios/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/radios/base.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/radios/filesystem.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/radios/filesystem_router.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/radios/htex.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/radios/multiprocessing.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/radios/udp.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/radios/udp_router.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/radios/zmq.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/radios/zmq_router.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/remote.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/types.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/app.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/models.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/plots/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/plots/default/workflow_plots.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/templates/app.html +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/templates/dag.html +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/templates/error.html +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/templates/layout.html +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/templates/task.html +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/templates/workflow.html +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/utils.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/version.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/views.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/multiprocessing.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/process_loggers.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/aws/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/aws/aws.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/aws/template.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/azure/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/azure/azure.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/azure/template.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/base.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/cluster_provider.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/condor/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/condor/condor.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/condor/template.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/errors.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/googlecloud/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/googlecloud/googlecloud.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/grid_engine/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/grid_engine/grid_engine.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/grid_engine/template.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/kubernetes/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/kubernetes/kube.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/kubernetes/template.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/local/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/local/local.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/lsf/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/lsf/lsf.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/lsf/template.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/pbspro/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/pbspro/pbspro.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/pbspro/template.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/slurm/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/slurm/slurm.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/slurm/template.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/torque/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/torque/template.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/torque/torque.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/py.typed +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/serialize/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/serialize/base.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/serialize/concretes.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/serialize/errors.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/serialize/facade.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/serialize/proxystore.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/callables_helper.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/azure_single_node.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/bluewaters.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/bridges.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/cc_in2p3.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/comet.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/ec2_single_node.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/ec2_spot.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/flux_local.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/frontera.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/globus_compute.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/htex_local.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/htex_local_alternate.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/htex_local_intask_staging.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/htex_local_rsync_staging.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/local_radical.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/local_radical_mpi.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/local_threads.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/local_threads_globus.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/midway.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/nscc_singapore.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/osg_htex.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/petrelkube.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/slurm_local.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/summit.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/user_opts.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/workqueue_ex.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/conftest.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/integration/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/integration/latency.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/integration/test_apps/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/integration/test_stress/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/manual_tests/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/manual_tests/htex_local.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/manual_tests/test_basic.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/manual_tests/test_log_filter.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/manual_tests/test_memory_limits.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/manual_tests/test_regression_220.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/manual_tests/test_worker_count.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/site_tests/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/site_tests/site_config_selector.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/sites/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/sites/test_affinity.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/sites/test_concurrent.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/sites/test_dynamic_executor.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/sites/test_ec2.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/sites/test_launchers.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/sites/test_mpi/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/sites/test_worker_info.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_bash_apps/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_bash_apps/test_basic.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_bash_apps/test_inputs_default.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_bash_apps/test_memoize.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_bash_apps/test_multiline.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_bash_apps/test_pipeline.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_bash_apps/test_std_uri.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_bash_apps/test_stdout.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_callables.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_checkpointing/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_checkpointing/test_task_exit.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_curvezmq.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_docs/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_docs/test_from_slides.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_docs/test_kwargs.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_docs/test_workflow1.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_docs/test_workflow4.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_error_handling/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_error_handling/test_fail.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_error_handling/test_python_walltime.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_error_handling/test_resource_spec.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_error_handling/test_retries.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_execute_task.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_flowcontrol/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_flux.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_basic.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_block_manager_selector_unit.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_command_client_timeout.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_command_concurrency_regression_1321.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_connected_blocks.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_cpu_affinity_explicit.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_disconnected_blocks.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_disconnected_blocks_failing_provider.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_drain.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_manager_failure.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_manager_selector_by_block.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_managers_command.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_missing_worker.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_multiple_disconnected_blocks.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_priority_queue.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_resource_spec_validation.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_worker_failure.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_zmq_binding.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_monitoring/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_monitoring/test_app_names.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_monitoring/test_basic.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_monitoring/test_exit_helper.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_monitoring/test_htex_fuzz_zmq.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_monitoring/test_incomplete_futures.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_monitoring/test_memoization_representation.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_monitoring/test_radio_filesystem.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_monitoring/test_radio_multiprocessing.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_monitoring/test_radio_udp.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_monitoring/test_radio_zmq.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_monitoring/test_stdouterr.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_mpi_apps/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_mpi_apps/test_bad_mpi_config.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_mpi_apps/test_mpi_prefix.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_mpi_apps/test_mpiex.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_mpi_apps/test_resource_spec.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_providers/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_providers/test_kubernetes_provider.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_providers/test_local_provider.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_providers/test_pbspro_template.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_providers/test_slurm_instantiate.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_providers/test_slurm_template.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_providers/test_submiterror_deprecation.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_basic.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_context_manager.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_dep_standard_futures.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_dependencies_deep.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_depfail_propagation.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_fail.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_futures.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_inputs_default.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_join.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_lifted.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_mapred.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_memoize_exception.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_outputs.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_overview.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_pipeline.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_pluggable_future_resolution.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_simple.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_timeout.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_type5.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_radical/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_radical/test_mpi_funcs.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_regression/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_regression/test_1480.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_regression/test_1653.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_regression/test_221.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_regression/test_226.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_regression/test_2652.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_regression/test_69a.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_regression/test_97_parallelism_0.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_regression/test_98.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_scaling/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_scaling/test_block_error_handler.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_scaling/test_regression_1621.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_scaling/test_regression_3568_scaledown_vs_MISSING.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_scaling/test_regression_3696_oscillation.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_scaling/test_scale_down.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_scaling/test_shutdown_scalein.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_scaling/test_worker_interchange_bad_messages_3262.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_serialization/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_serialization/test_2555_caching_deserializer.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_serialization/test_3495_deserialize_managerlost.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_serialization/test_basic.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_serialization/test_htex_code_cache.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_serialization/test_proxystore_configured.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_serialization/test_proxystore_impl.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_shutdown/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_shutdown/test_kill_monitoring.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_staging/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_staging/staging_provider.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_staging/test_1316.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_staging/test_docs_1.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_staging/test_docs_2.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_staging/test_file.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_staging/test_file_apps.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_staging/test_file_staging.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_staging/test_output_chain_filenames.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_staging/test_staging_globus.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_staging/test_staging_https.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_staging/test_staging_stdout.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_staging/test_zip_in.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_staging/test_zip_out.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_staging/test_zip_to_zip.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_summary.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_thread_parallelism.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_threads/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_threads/test_configs.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_utils/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_utils/test_execute_wait.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_utils/test_logutils.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_utils/test_representation_mixin.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_utils/test_sanitize_dns.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/unit/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/unit/test_address.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/unit/test_file.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/unit/test_globus_compute_executor.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/unit/test_usage_tracking.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/utils.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/usage_tracking/__init__.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/usage_tracking/api.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/usage_tracking/levels.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/usage_tracking/usage.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl/utils.py +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl.egg-info/dependency_links.txt +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl.egg-info/entry_points.txt +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl.egg-info/requires.txt +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/parsl.egg-info/top_level.txt +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/requirements.txt +0 -0
- {parsl-2025.9.22 → parsl-2025.10.6}/setup.cfg +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: parsl
|
|
3
|
-
Version: 2025.
|
|
3
|
+
Version: 2025.10.6
|
|
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.
|
|
6
|
+
Download-URL: https://github.com/Parsl/parsl/archive/2025.10.06.tar.gz
|
|
7
7
|
Author: The Parsl Team
|
|
8
8
|
Author-email: parsl@googlegroups.com
|
|
9
9
|
License: Apache 2.0
|
|
@@ -11,11 +11,10 @@ Keywords: Workflows,Scientific computing
|
|
|
11
11
|
Classifier: Development Status :: 5 - Production/Stable
|
|
12
12
|
Classifier: Intended Audience :: Developers
|
|
13
13
|
Classifier: License :: OSI Approved :: Apache Software License
|
|
14
|
-
Classifier: Programming Language :: Python :: 3.9
|
|
15
14
|
Classifier: Programming Language :: Python :: 3.10
|
|
16
15
|
Classifier: Programming Language :: Python :: 3.11
|
|
17
16
|
Classifier: Programming Language :: Python :: 3.12
|
|
18
|
-
Requires-Python: >=3.
|
|
17
|
+
Requires-Python: >=3.10.0
|
|
19
18
|
Provides-Extra: monitoring
|
|
20
19
|
Provides-Extra: visualization
|
|
21
20
|
Provides-Extra: aws
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Parsl - Parallel Scripting Library
|
|
2
2
|
==================================
|
|
3
|
-
|licence| |docs| |NSF-1550588| |NSF-1550476| |NSF-1550562| |NSF-1550528| |NumFOCUS| |CZI-EOSS|
|
|
3
|
+
|licence| |docs| |NSF-1550588| |NSF-1550476| |NSF-1550562| |NSF-1550528| |NumFOCUS| |CZI-EOSS| |paper|
|
|
4
4
|
|
|
5
5
|
Parsl extends parallelism in Python beyond a single computer.
|
|
6
6
|
|
|
@@ -67,6 +67,9 @@ then explore the `parallel computing patterns <https://parsl.readthedocs.io/en/s
|
|
|
67
67
|
.. |NumFOCUS| image:: https://img.shields.io/badge/powered%20by-NumFOCUS-orange.svg?style=flat&colorA=E1523D&colorB=007D8A
|
|
68
68
|
:target: https://numfocus.org
|
|
69
69
|
:alt: Powered by NumFOCUS
|
|
70
|
+
.. |paper| image:: https://img.shields.io/badge/Software_DOI-10.1145/3307681.3325400-blue
|
|
71
|
+
:target: https://doi.org/10.1145/3307681.3325400
|
|
72
|
+
:alt: Conference proceedings paper
|
|
70
73
|
|
|
71
74
|
|
|
72
75
|
Quickstart
|
|
@@ -120,7 +123,7 @@ For Developers
|
|
|
120
123
|
Requirements
|
|
121
124
|
============
|
|
122
125
|
|
|
123
|
-
Parsl is supported in Python 3.
|
|
126
|
+
Parsl is supported in Python 3.10+. Requirements can be found `here <requirements.txt>`_. Requirements for running tests can be found `here <test-requirements.txt>`_.
|
|
124
127
|
|
|
125
128
|
Code of Conduct
|
|
126
129
|
===============
|
|
@@ -2,32 +2,45 @@ import argparse
|
|
|
2
2
|
import concurrent.futures
|
|
3
3
|
import importlib
|
|
4
4
|
import time
|
|
5
|
+
from typing import Any, Dict
|
|
5
6
|
|
|
6
7
|
import parsl
|
|
8
|
+
from parsl.dataflow.dflow import DataFlowKernel
|
|
7
9
|
|
|
8
10
|
min_iterations = 2
|
|
9
11
|
|
|
10
12
|
|
|
11
13
|
# TODO: factor with conftest.py where this is copy/pasted from?
|
|
12
|
-
def load_dfk_from_config(filename):
|
|
14
|
+
def load_dfk_from_config(filename: str) -> DataFlowKernel:
|
|
13
15
|
spec = importlib.util.spec_from_file_location('', filename)
|
|
16
|
+
|
|
17
|
+
if spec is None:
|
|
18
|
+
raise RuntimeError("Could not import configuration")
|
|
19
|
+
|
|
20
|
+
module = importlib.util.module_from_spec(spec)
|
|
21
|
+
|
|
22
|
+
if spec.loader is None:
|
|
23
|
+
raise RuntimeError("Could not load configuration")
|
|
24
|
+
|
|
25
|
+
spec.loader.exec_module(module)
|
|
26
|
+
|
|
14
27
|
module = importlib.util.module_from_spec(spec)
|
|
15
28
|
spec.loader.exec_module(module)
|
|
16
29
|
|
|
17
30
|
if hasattr(module, 'config'):
|
|
18
|
-
parsl.load(module.config)
|
|
31
|
+
return parsl.load(module.config)
|
|
19
32
|
elif hasattr(module, 'fresh_config'):
|
|
20
|
-
parsl.load(module.fresh_config())
|
|
33
|
+
return parsl.load(module.fresh_config())
|
|
21
34
|
else:
|
|
22
35
|
raise RuntimeError("Config module does not define config or fresh_config")
|
|
23
36
|
|
|
24
37
|
|
|
25
38
|
@parsl.python_app
|
|
26
|
-
def app(extra_payload, parsl_resource_specification={}):
|
|
39
|
+
def app(extra_payload: Any, parsl_resource_specification: Dict = {}) -> int:
|
|
27
40
|
return 7
|
|
28
41
|
|
|
29
42
|
|
|
30
|
-
def performance(*, resources: dict, target_t: float, args_extra_size: int):
|
|
43
|
+
def performance(*, resources: dict, target_t: float, args_extra_size: int) -> None:
|
|
31
44
|
n = 10
|
|
32
45
|
|
|
33
46
|
delta_t: float
|
|
@@ -82,6 +95,7 @@ Example usage: python -m parsl.benchmark.perf --config parsl/tests/configs/workq
|
|
|
82
95
|
parser.add_argument("--resources", metavar="EXPR", help="parsl_resource_specification dictionary")
|
|
83
96
|
parser.add_argument("--time", metavar="SECONDS", help="target number of seconds for an iteration", default=120, type=float)
|
|
84
97
|
parser.add_argument("--argsize", metavar="BYTES", help="extra bytes to add into app invocation arguments", default=0, type=int)
|
|
98
|
+
parser.add_argument("--version", action="version", version=f"parsl-perf from Parsl {parsl.__version__}")
|
|
85
99
|
|
|
86
100
|
args = parser.parse_args()
|
|
87
101
|
|
|
@@ -90,10 +104,9 @@ Example usage: python -m parsl.benchmark.perf --config parsl/tests/configs/workq
|
|
|
90
104
|
else:
|
|
91
105
|
resources = {}
|
|
92
106
|
|
|
93
|
-
load_dfk_from_config(args.config)
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
parsl.dfk().cleanup()
|
|
107
|
+
with load_dfk_from_config(args.config):
|
|
108
|
+
performance(resources=resources, target_t=args.time, args_extra_size=args.argsize)
|
|
109
|
+
print("Tests complete - leaving DFK block")
|
|
97
110
|
print("The end")
|
|
98
111
|
|
|
99
112
|
|
|
@@ -175,7 +175,7 @@ class DataFlowKernel:
|
|
|
175
175
|
else:
|
|
176
176
|
checkpoint_files = []
|
|
177
177
|
|
|
178
|
-
self.memoizer = Memoizer(
|
|
178
|
+
self.memoizer = Memoizer(memoize=config.app_cache, checkpoint_files=checkpoint_files)
|
|
179
179
|
self.checkpointed_tasks = 0
|
|
180
180
|
self._checkpoint_timer = None
|
|
181
181
|
self.checkpoint_mode = config.checkpoint_mode
|
|
@@ -375,6 +375,7 @@ class DataFlowKernel:
|
|
|
375
375
|
logger.info("Task {} failed due to dependency failure so skipping retries".format(task_id))
|
|
376
376
|
task_record['time_returned'] = datetime.datetime.now()
|
|
377
377
|
self._send_task_log_info(task_record)
|
|
378
|
+
self.memoizer.update_memo(task_record)
|
|
378
379
|
with task_record['app_fu']._update_lock:
|
|
379
380
|
task_record['app_fu'].set_exception(e)
|
|
380
381
|
|
|
@@ -400,6 +401,7 @@ class DataFlowKernel:
|
|
|
400
401
|
self.update_task_state(task_record, States.failed)
|
|
401
402
|
task_record['time_returned'] = datetime.datetime.now()
|
|
402
403
|
self._send_task_log_info(task_record)
|
|
404
|
+
self.memoizer.update_memo(task_record)
|
|
403
405
|
with task_record['app_fu']._update_lock:
|
|
404
406
|
task_record['app_fu'].set_exception(e)
|
|
405
407
|
|
|
@@ -446,6 +448,7 @@ class DataFlowKernel:
|
|
|
446
448
|
self.update_task_state(task_record, States.failed)
|
|
447
449
|
task_record['time_returned'] = datetime.datetime.now()
|
|
448
450
|
self._send_task_log_info(task_record)
|
|
451
|
+
self.memoizer.update_memo(task_record)
|
|
449
452
|
with task_record['app_fu']._update_lock:
|
|
450
453
|
task_record['app_fu'].set_exception(
|
|
451
454
|
TypeError(f"join_app body must return a Future or list of Futures, got {joinable} of type {type(joinable)}"))
|
|
@@ -521,6 +524,7 @@ class DataFlowKernel:
|
|
|
521
524
|
|
|
522
525
|
self.update_task_state(task_record, States.failed)
|
|
523
526
|
task_record['time_returned'] = datetime.datetime.now()
|
|
527
|
+
self.memoizer.update_memo(task_record)
|
|
524
528
|
with task_record['app_fu']._update_lock:
|
|
525
529
|
task_record['app_fu'].set_exception(e)
|
|
526
530
|
|
|
@@ -561,8 +565,6 @@ class DataFlowKernel:
|
|
|
561
565
|
if not task_record['app_fu'] == future:
|
|
562
566
|
logger.error("Internal consistency error: callback future is not the app_fu in task structure, for task {}".format(task_id))
|
|
563
567
|
|
|
564
|
-
self.memoizer.update_memo(task_record, future)
|
|
565
|
-
|
|
566
568
|
# Cover all checkpointing cases here:
|
|
567
569
|
# Do we need to checkpoint now, or queue for later,
|
|
568
570
|
# or do nothing?
|
|
@@ -591,6 +593,7 @@ class DataFlowKernel:
|
|
|
591
593
|
logger.info(f"Task {task_record['id']} completed ({old_state.name} -> {new_state.name})")
|
|
592
594
|
task_record['time_returned'] = datetime.datetime.now()
|
|
593
595
|
|
|
596
|
+
self.memoizer.update_memo(task_record)
|
|
594
597
|
with task_record['app_fu']._update_lock:
|
|
595
598
|
task_record['app_fu'].set_result(result)
|
|
596
599
|
|
|
@@ -1202,7 +1205,6 @@ class DataFlowKernel:
|
|
|
1202
1205
|
|
|
1203
1206
|
self.log_task_states()
|
|
1204
1207
|
|
|
1205
|
-
# Checkpointing takes priority over the rest of the tasks
|
|
1206
1208
|
# checkpoint if any valid checkpoint method is specified
|
|
1207
1209
|
if self.checkpoint_mode is not None:
|
|
1208
1210
|
self.checkpoint()
|
|
@@ -4,20 +4,16 @@ import hashlib
|
|
|
4
4
|
import logging
|
|
5
5
|
import os
|
|
6
6
|
import pickle
|
|
7
|
+
import types
|
|
8
|
+
from concurrent.futures import Future
|
|
7
9
|
from functools import lru_cache, singledispatch
|
|
8
|
-
from typing import
|
|
10
|
+
from typing import Any, Dict, List, Optional, Sequence
|
|
9
11
|
|
|
10
12
|
import typeguard
|
|
11
13
|
|
|
12
14
|
from parsl.dataflow.errors import BadCheckpoint
|
|
13
15
|
from parsl.dataflow.taskrecord import TaskRecord
|
|
14
16
|
|
|
15
|
-
if TYPE_CHECKING:
|
|
16
|
-
from parsl import DataFlowKernel # import loop at runtime - needed for typechecking - TODO turn into "if typing:"
|
|
17
|
-
|
|
18
|
-
import types
|
|
19
|
-
from concurrent.futures import Future
|
|
20
|
-
|
|
21
17
|
logger = logging.getLogger(__name__)
|
|
22
18
|
|
|
23
19
|
|
|
@@ -150,17 +146,13 @@ class Memoizer:
|
|
|
150
146
|
|
|
151
147
|
"""
|
|
152
148
|
|
|
153
|
-
def __init__(self,
|
|
149
|
+
def __init__(self, *, memoize: bool = True, checkpoint_files: Sequence[str]):
|
|
154
150
|
"""Initialize the memoizer.
|
|
155
151
|
|
|
156
|
-
Args:
|
|
157
|
-
- dfk (DFK obj): The DFK object
|
|
158
|
-
|
|
159
152
|
KWargs:
|
|
160
153
|
- memoize (Bool): enable memoization or not.
|
|
161
154
|
- checkpoint (Dict): A checkpoint loaded as a dict.
|
|
162
155
|
"""
|
|
163
|
-
self.dfk = dfk
|
|
164
156
|
self.memoize = memoize
|
|
165
157
|
|
|
166
158
|
checkpoint = self.load_checkpoints(checkpoint_files)
|
|
@@ -242,16 +234,14 @@ class Memoizer:
|
|
|
242
234
|
assert isinstance(result, Future) or result is None
|
|
243
235
|
return result
|
|
244
236
|
|
|
245
|
-
def update_memo(self, task: TaskRecord
|
|
237
|
+
def update_memo(self, task: TaskRecord) -> None:
|
|
246
238
|
"""Updates the memoization lookup table with the result from a task.
|
|
239
|
+
This doesn't move any values around but associates the memoization
|
|
240
|
+
hashsum with the completed (by success or failure) AppFuture.
|
|
247
241
|
|
|
248
242
|
Args:
|
|
249
|
-
- task (
|
|
250
|
-
- r (Result future): Result future
|
|
243
|
+
- task (TaskRecord) : A task record from dfk.tasks
|
|
251
244
|
"""
|
|
252
|
-
# TODO: could use typeguard
|
|
253
|
-
assert isinstance(r, Future)
|
|
254
|
-
|
|
255
245
|
task_id = task['id']
|
|
256
246
|
|
|
257
247
|
if not self.memoize or not task['memoize'] or 'hashsum' not in task:
|
|
@@ -265,7 +255,7 @@ class Memoizer:
|
|
|
265
255
|
logger.info(f"Replacing app cache entry {task['hashsum']} with result from task {task_id}")
|
|
266
256
|
else:
|
|
267
257
|
logger.debug(f"Storing app cache entry {task['hashsum']} with result from task {task_id}")
|
|
268
|
-
self.memo_lookup_table[task['hashsum']] =
|
|
258
|
+
self.memo_lookup_table[task['hashsum']] = task['app_fu']
|
|
269
259
|
|
|
270
260
|
def _load_checkpoints(self, checkpointDirs: Sequence[str]) -> Dict[str, Future[Any]]:
|
|
271
261
|
"""Load a checkpoint file into a lookup table.
|
|
@@ -160,6 +160,12 @@ GENERAL_HTEX_PARAM_DOCS = """provider : :class:`~parsl.providers.base.ExecutionP
|
|
|
160
160
|
""" # Documentation for params used by both HTEx and MPIEx
|
|
161
161
|
|
|
162
162
|
|
|
163
|
+
class HTEXFuture(Future):
|
|
164
|
+
def __init__(self, task_id) -> None:
|
|
165
|
+
super().__init__()
|
|
166
|
+
self.parsl_executor_task_id = task_id
|
|
167
|
+
|
|
168
|
+
|
|
163
169
|
class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageInformation):
|
|
164
170
|
__doc__ = f"""Executor designed for cluster-scale
|
|
165
171
|
|
|
@@ -237,7 +243,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
|
|
|
237
243
|
@typeguard.typechecked
|
|
238
244
|
def __init__(self,
|
|
239
245
|
label: str = 'HighThroughputExecutor',
|
|
240
|
-
provider: ExecutionProvider =
|
|
246
|
+
provider: Optional[ExecutionProvider] = None,
|
|
241
247
|
launch_cmd: Optional[str] = None,
|
|
242
248
|
interchange_launch_cmd: Optional[Sequence[str]] = None,
|
|
243
249
|
address: Optional[str] = None,
|
|
@@ -267,7 +273,9 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
|
|
|
267
273
|
|
|
268
274
|
logger.debug("Initializing HighThroughputExecutor")
|
|
269
275
|
|
|
270
|
-
BlockProviderExecutor.__init__(self,
|
|
276
|
+
BlockProviderExecutor.__init__(self,
|
|
277
|
+
provider=provider if provider else LocalProvider(),
|
|
278
|
+
block_error_handler=block_error_handler)
|
|
271
279
|
self.label = label
|
|
272
280
|
self.worker_debug = worker_debug
|
|
273
281
|
self.storage_access = storage_access
|
|
@@ -501,10 +509,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
|
|
|
501
509
|
else:
|
|
502
510
|
|
|
503
511
|
for serialized_msg in msgs:
|
|
504
|
-
|
|
505
|
-
msg = pickle.loads(serialized_msg)
|
|
506
|
-
except pickle.UnpicklingError:
|
|
507
|
-
raise BadMessage("Message received could not be unpickled")
|
|
512
|
+
msg = pickle.loads(serialized_msg)
|
|
508
513
|
|
|
509
514
|
if msg['type'] == 'result':
|
|
510
515
|
try:
|
|
@@ -671,7 +676,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
|
|
|
671
676
|
logger.debug("Sending hold to manager: {}".format(manager['manager']))
|
|
672
677
|
self._hold_manager(manager['manager'])
|
|
673
678
|
|
|
674
|
-
def submit(self, func, resource_specification, *args, **kwargs):
|
|
679
|
+
def submit(self, func: Callable, resource_specification: dict, *args, **kwargs) -> HTEXFuture:
|
|
675
680
|
"""Submits work to the outgoing_q.
|
|
676
681
|
|
|
677
682
|
The outgoing_q is an external process listens on this
|
|
@@ -692,32 +697,83 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
|
|
|
692
697
|
|
|
693
698
|
self.validate_resource_spec(resource_specification)
|
|
694
699
|
|
|
695
|
-
if self.bad_state_is_set:
|
|
696
|
-
raise self.executor_exception
|
|
697
|
-
|
|
698
|
-
self._task_counter += 1
|
|
699
|
-
task_id = self._task_counter
|
|
700
|
-
|
|
701
700
|
# handle people sending blobs gracefully
|
|
702
701
|
if logger.getEffectiveLevel() <= logging.DEBUG:
|
|
703
702
|
args_to_print = tuple([ar if len(ar := repr(arg)) < 100 else (ar[:100] + '...') for arg in args])
|
|
704
703
|
logger.debug("Pushing function {} to queue with args {}".format(func, args_to_print))
|
|
705
704
|
|
|
706
|
-
fut = Future()
|
|
707
|
-
fut.parsl_executor_task_id = task_id
|
|
708
|
-
self.tasks[task_id] = fut
|
|
709
|
-
|
|
710
705
|
try:
|
|
711
706
|
fn_buf = pack_apply_message(func, args, kwargs, buffer_threshold=1 << 20)
|
|
712
707
|
except TypeError:
|
|
713
708
|
raise SerializationError(func.__name__)
|
|
714
709
|
|
|
715
|
-
|
|
710
|
+
context = {}
|
|
711
|
+
if resource_specification:
|
|
712
|
+
context["resource_spec"] = resource_specification
|
|
713
|
+
|
|
714
|
+
return self.submit_payload(context, fn_buf)
|
|
715
|
+
|
|
716
|
+
def submit_payload(self, context: dict, buffer: bytes) -> HTEXFuture:
|
|
717
|
+
"""
|
|
718
|
+
Submit specially crafted payloads.
|
|
719
|
+
|
|
720
|
+
For use-cases where the ``HighThroughputExecutor`` consumer needs the payload
|
|
721
|
+
handled by the worker in a special way. For example, if the function is
|
|
722
|
+
serialized differently than Parsl's default approach, or if the task must
|
|
723
|
+
be setup more precisely than Parsl's default ``execute_task`` allows.
|
|
724
|
+
|
|
725
|
+
An example interaction:
|
|
726
|
+
|
|
727
|
+
.. code-block: python
|
|
728
|
+
|
|
729
|
+
>>> htex: HighThroughputExecutor # setup prior to this example
|
|
730
|
+
>>> ctxt = {
|
|
731
|
+
... "task_executor": {
|
|
732
|
+
... "f": "full.import.path.of.custom_execute_task",
|
|
733
|
+
... "a": ("additional", "arguments"),
|
|
734
|
+
... "k": {"some": "keyword", "args": "here"}
|
|
735
|
+
... }
|
|
736
|
+
... }
|
|
737
|
+
>>> fn_buf = custom_serialize(task_func, *task_args, **task_kwargs)
|
|
738
|
+
>>> fut = htex.submit_payload(ctxt, fn_buf)
|
|
739
|
+
|
|
740
|
+
The custom ``custom_execute_task`` would be dynamically imported, and
|
|
741
|
+
invoked as:
|
|
742
|
+
|
|
743
|
+
.. code-block: python
|
|
744
|
+
|
|
745
|
+
args = ("additional", "arguments")
|
|
746
|
+
kwargs = {"some": "keyword", "args": "here"}
|
|
747
|
+
result = custom_execute_task(fn_buf, *args, **kwargs)
|
|
748
|
+
|
|
749
|
+
Parameters
|
|
750
|
+
----------
|
|
751
|
+
context:
|
|
752
|
+
A task-specific context associated with the function buffer. Parsl
|
|
753
|
+
currently implements the keys ``task_executor`` and ``resource_spec``
|
|
754
|
+
|
|
755
|
+
buffer:
|
|
756
|
+
A serialized function, that will be deserialized and executed by
|
|
757
|
+
``execute_task`` (or custom function, if ``task_executor`` is specified)
|
|
758
|
+
|
|
759
|
+
Returns
|
|
760
|
+
-------
|
|
761
|
+
An HTEXFuture (a normal Future, with the attribute ``.parsl_executor_task_id``
|
|
762
|
+
set). The future will be set to done when the associated function buffer has
|
|
763
|
+
been invoked and completed.
|
|
764
|
+
"""
|
|
765
|
+
if self.bad_state_is_set:
|
|
766
|
+
raise self.executor_exception
|
|
767
|
+
|
|
768
|
+
self._task_counter += 1
|
|
769
|
+
task_id = self._task_counter
|
|
770
|
+
|
|
771
|
+
fut = HTEXFuture(task_id)
|
|
772
|
+
self.tasks[task_id] = fut
|
|
716
773
|
|
|
717
|
-
|
|
774
|
+
msg = {"task_id": task_id, "context": context, "buffer": buffer}
|
|
718
775
|
self.outgoing_q.put(msg)
|
|
719
776
|
|
|
720
|
-
# Return the future
|
|
721
777
|
return fut
|
|
722
778
|
|
|
723
779
|
@property
|
|
@@ -332,7 +332,7 @@ class Interchange:
|
|
|
332
332
|
msg = self.task_incoming.recv_pyobj()
|
|
333
333
|
|
|
334
334
|
# Process priority, higher number = lower priority
|
|
335
|
-
resource_spec = msg.get('resource_spec', {})
|
|
335
|
+
resource_spec = msg['context'].get('resource_spec', {})
|
|
336
336
|
priority = resource_spec.get('priority', float('inf'))
|
|
337
337
|
queue_entry = (-priority, -self.task_counter, msg)
|
|
338
338
|
|
|
@@ -360,9 +360,10 @@ class Interchange:
|
|
|
360
360
|
mtype = meta['type']
|
|
361
361
|
except Exception as e:
|
|
362
362
|
logger.warning(
|
|
363
|
-
|
|
363
|
+
'Failed to read manager message; ignoring message'
|
|
364
|
+
f' (Exception: [{type(e).__name__}] {e})'
|
|
364
365
|
)
|
|
365
|
-
logger.debug('
|
|
366
|
+
logger.debug('Raw message bytes:\n %r\n', msg_parts, exc_info=e)
|
|
366
367
|
return
|
|
367
368
|
|
|
368
369
|
logger.debug(
|
|
@@ -16,7 +16,6 @@ from parsl.executors.status_handling import BlockProviderExecutor
|
|
|
16
16
|
from parsl.jobs.states import JobStatus
|
|
17
17
|
from parsl.launchers import SimpleLauncher
|
|
18
18
|
from parsl.monitoring.radios.base import RadioConfig
|
|
19
|
-
from parsl.providers import LocalProvider
|
|
20
19
|
from parsl.providers.base import ExecutionProvider
|
|
21
20
|
|
|
22
21
|
|
|
@@ -47,7 +46,7 @@ class MPIExecutor(HighThroughputExecutor):
|
|
|
47
46
|
@typeguard.typechecked
|
|
48
47
|
def __init__(self,
|
|
49
48
|
label: str = 'MPIExecutor',
|
|
50
|
-
provider: ExecutionProvider =
|
|
49
|
+
provider: Optional[ExecutionProvider] = None,
|
|
51
50
|
launch_cmd: Optional[str] = None,
|
|
52
51
|
interchange_launch_cmd: Optional[str] = None,
|
|
53
52
|
address: Optional[str] = None,
|
{parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/high_throughput/mpi_resource_management.py
RENAMED
|
@@ -166,11 +166,10 @@ class MPITaskScheduler(TaskScheduler):
|
|
|
166
166
|
|
|
167
167
|
def put_task(self, task_package: dict):
|
|
168
168
|
"""Schedule task if resources are available otherwise backlog the task"""
|
|
169
|
-
resource_spec = task_package.get("resource_spec", {})
|
|
169
|
+
resource_spec = task_package.get("context", {}).get("resource_spec", {})
|
|
170
170
|
|
|
171
|
-
nodes_needed
|
|
172
|
-
|
|
173
|
-
if nodes_needed:
|
|
171
|
+
if nodes_needed := resource_spec.get("num_nodes"):
|
|
172
|
+
tid = task_package["task_id"]
|
|
174
173
|
try:
|
|
175
174
|
allocated_nodes = self._get_nodes(nodes_needed)
|
|
176
175
|
except MPINodesUnavailable:
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
|
|
3
3
|
import argparse
|
|
4
|
+
import importlib
|
|
4
5
|
import logging
|
|
5
6
|
import math
|
|
6
7
|
import multiprocessing
|
|
@@ -17,7 +18,7 @@ from importlib.metadata import distributions
|
|
|
17
18
|
from multiprocessing.context import SpawnProcess
|
|
18
19
|
from multiprocessing.managers import DictProxy
|
|
19
20
|
from multiprocessing.sharedctypes import Synchronized
|
|
20
|
-
from typing import Dict, List, Optional, Sequence
|
|
21
|
+
from typing import Callable, Dict, List, Optional, Sequence
|
|
21
22
|
|
|
22
23
|
import psutil
|
|
23
24
|
import zmq
|
|
@@ -373,6 +374,8 @@ class Manager:
|
|
|
373
374
|
if socks.get(ix_sock) == zmq.POLLIN:
|
|
374
375
|
pkl_msg = ix_sock.recv()
|
|
375
376
|
tasks = pickle.loads(pkl_msg)
|
|
377
|
+
del pkl_msg
|
|
378
|
+
|
|
376
379
|
last_interchange_contact = time.time()
|
|
377
380
|
|
|
378
381
|
if tasks == HEARTBEAT_CODE:
|
|
@@ -454,6 +457,7 @@ class Manager:
|
|
|
454
457
|
'exception': serialize(RemoteExceptionWrapper(*sys.exc_info()))}
|
|
455
458
|
pkl_package = pickle.dumps(result_package)
|
|
456
459
|
self.pending_result_queue.put(pkl_package)
|
|
460
|
+
del pkl_package
|
|
457
461
|
except KeyError:
|
|
458
462
|
logger.info("Worker {} was not busy when it died".format(worker_id))
|
|
459
463
|
|
|
@@ -770,17 +774,33 @@ def worker(
|
|
|
770
774
|
ready_worker_count.value -= 1
|
|
771
775
|
worker_enqueued = False
|
|
772
776
|
|
|
773
|
-
|
|
777
|
+
ctxt = req["context"]
|
|
778
|
+
res_spec = ctxt.get("resource_spec", {})
|
|
779
|
+
|
|
780
|
+
_init_mpi_env(mpi_launcher=mpi_launcher, resource_spec=res_spec)
|
|
781
|
+
|
|
782
|
+
exec_func: Callable = execute_task
|
|
783
|
+
exec_args = ()
|
|
784
|
+
exec_kwargs = {}
|
|
774
785
|
|
|
775
786
|
try:
|
|
776
|
-
|
|
787
|
+
if task_executor := ctxt.get("task_executor", None):
|
|
788
|
+
mod_name, _, fn_name = task_executor["f"].rpartition(".")
|
|
789
|
+
exec_mod = importlib.import_module(mod_name)
|
|
790
|
+
exec_func = getattr(exec_mod, fn_name)
|
|
791
|
+
|
|
792
|
+
exec_args = task_executor.get("a", ())
|
|
793
|
+
exec_kwargs = task_executor.get("k", {})
|
|
794
|
+
|
|
795
|
+
result = exec_func(req['buffer'], *exec_args, **exec_kwargs)
|
|
777
796
|
serialized_result = serialize(result, buffer_threshold=1000000)
|
|
778
797
|
except Exception as e:
|
|
779
798
|
logger.info('Caught an exception: {}'.format(e))
|
|
780
799
|
result_package = {'type': 'result', 'task_id': tid, 'exception': serialize(RemoteExceptionWrapper(*sys.exc_info()))}
|
|
781
800
|
else:
|
|
782
801
|
result_package = {'type': 'result', 'task_id': tid, 'result': serialized_result}
|
|
783
|
-
|
|
802
|
+
del serialized_result
|
|
803
|
+
del req
|
|
784
804
|
|
|
785
805
|
logger.info("Completed executor task {}".format(tid))
|
|
786
806
|
try:
|
|
@@ -792,6 +812,7 @@ def worker(
|
|
|
792
812
|
})
|
|
793
813
|
|
|
794
814
|
result_queue.put(pkl_package)
|
|
815
|
+
del pkl_package, result_package
|
|
795
816
|
tasks_in_progress.pop(worker_id)
|
|
796
817
|
logger.info("All processing finished for executor task {}".format(tid))
|
|
797
818
|
|
|
@@ -136,30 +136,18 @@ class TasksOutgoing:
|
|
|
136
136
|
self.port = self.zmq_socket.bind_to_random_port(tcp_url(ip_address),
|
|
137
137
|
min_port=port_range[0],
|
|
138
138
|
max_port=port_range[1])
|
|
139
|
-
self.poller = zmq.Poller()
|
|
140
|
-
self.poller.register(self.zmq_socket, zmq.POLLOUT)
|
|
141
139
|
|
|
142
140
|
def put(self, message):
|
|
143
141
|
""" This function needs to be fast at the same time aware of the possibility of
|
|
144
142
|
ZMQ pipes overflowing.
|
|
145
143
|
|
|
146
|
-
The timeout increases slowly if contention is detected on ZMQ pipes.
|
|
147
144
|
We could set copy=False and get slightly better latency but this results
|
|
148
145
|
in ZMQ sockets reaching a broken state once there are ~10k tasks in flight.
|
|
149
146
|
This issue can be magnified if each the serialized buffer itself is larger.
|
|
150
147
|
"""
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
if self.zmq_socket in socks and socks[self.zmq_socket] == zmq.POLLOUT:
|
|
155
|
-
# The copy option adds latency but reduces the risk of ZMQ overflow
|
|
156
|
-
logger.debug("Sending TasksOutgoing message")
|
|
157
|
-
self.zmq_socket.send_pyobj(message, copy=True)
|
|
158
|
-
logger.debug("Sent TasksOutgoing message")
|
|
159
|
-
return
|
|
160
|
-
else:
|
|
161
|
-
timeout_ms *= 2
|
|
162
|
-
logger.debug("Not sending due to non-ready zmq pipe, timeout: {} ms".format(timeout_ms))
|
|
148
|
+
logger.debug("Sending TasksOutgoing message")
|
|
149
|
+
self.zmq_socket.send_pyobj(message)
|
|
150
|
+
logger.debug("Sent TasksOutgoing message")
|
|
163
151
|
|
|
164
152
|
def close(self):
|
|
165
153
|
self.zmq_socket.close()
|
|
@@ -192,20 +180,15 @@ class ResultsIncoming:
|
|
|
192
180
|
self.port = self.results_receiver.bind_to_random_port(tcp_url(ip_address),
|
|
193
181
|
min_port=port_range[0],
|
|
194
182
|
max_port=port_range[1])
|
|
195
|
-
self.poller = zmq.Poller()
|
|
196
|
-
self.poller.register(self.results_receiver, zmq.POLLIN)
|
|
197
183
|
|
|
198
184
|
def get(self, timeout_ms=None):
|
|
199
185
|
"""Get a message from the queue, returning None if timeout expires
|
|
200
186
|
without a message. timeout is measured in milliseconds.
|
|
201
187
|
"""
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
return m
|
|
207
|
-
else:
|
|
208
|
-
return None
|
|
188
|
+
if zmq.POLLIN == self.results_receiver.poll(timeout_ms, zmq.POLLIN):
|
|
189
|
+
logger.debug("Receiving ResultsIncoming multipart message")
|
|
190
|
+
return self.results_receiver.recv_multipart()
|
|
191
|
+
return None
|
|
209
192
|
|
|
210
193
|
def close(self):
|
|
211
194
|
self.results_receiver.close()
|
|
@@ -107,13 +107,17 @@ class TaskVineExecutor(BlockProviderExecutor, putils.RepresentationMixin):
|
|
|
107
107
|
function_exec_mode: Union[Literal['regular'], Literal['serverless']] = 'regular',
|
|
108
108
|
manager_config: TaskVineManagerConfig = TaskVineManagerConfig(),
|
|
109
109
|
factory_config: TaskVineFactoryConfig = TaskVineFactoryConfig(),
|
|
110
|
-
provider: Optional[ExecutionProvider] =
|
|
110
|
+
provider: Optional[ExecutionProvider] = None,
|
|
111
111
|
storage_access: Optional[List[Staging]] = None,
|
|
112
112
|
remote_monitoring_radio: Optional[RadioConfig] = None):
|
|
113
113
|
|
|
114
114
|
# Set worker launch option for this executor
|
|
115
115
|
if worker_launch_method == 'factory' or worker_launch_method == 'manual':
|
|
116
116
|
provider = None
|
|
117
|
+
elif worker_launch_method == 'provider' and provider is None:
|
|
118
|
+
# provider method chosen, but no explicit provider supplied to __init__
|
|
119
|
+
# so default to LocalProvider
|
|
120
|
+
provider = LocalProvider(init_blocks=1)
|
|
117
121
|
|
|
118
122
|
# Initialize the parent class with the execution provider and block error handling enabled.
|
|
119
123
|
# If provider is None, then no worker is launched via the provider method.
|