parsl 2025.9.29__tar.gz → 2025.10.13__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.29/parsl.egg-info → parsl-2025.10.13}/PKG-INFO +2 -2
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/benchmark/perf.py +24 -8
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/dataflow/dflow.py +5 -2
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/base.py +2 -2
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/globus_compute.py +0 -4
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/high_throughput/executor.py +67 -14
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/high_throughput/process_worker_pool.py +16 -3
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/radios/filesystem.py +2 -1
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/radios/htex.py +2 -1
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/radios/multiprocessing.py +2 -1
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/radios/udp.py +2 -1
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/base.py +24 -37
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_checkpointing/test_regression_233.py +0 -1
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_htex.py +36 -1
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_garbage_collect.py +1 -6
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_memoize_2.py +11 -1
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/version.py +1 -1
- {parsl-2025.9.29 → parsl-2025.10.13/parsl.egg-info}/PKG-INFO +2 -2
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl.egg-info/SOURCES.txt +0 -1
- parsl-2025.9.29/parsl/tests/configs/local_threads_no_cache.py +0 -11
- {parsl-2025.9.29 → parsl-2025.10.13}/LICENSE +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/MANIFEST.in +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/README.rst +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/addresses.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/app/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/app/app.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/app/bash.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/app/errors.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/app/futures.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/app/python.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/benchmark/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/concurrent/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/config.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/ASPIRE1.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/Azure.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/anvil.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/bridges.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/cc_in2p3.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/delta.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/ec2.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/expanse.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/frontera.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/gc_multisite.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/gc_tutorial.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/htex_local.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/illinoiscluster.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/improv.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/kubernetes.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/local_threads.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/midway.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/osg.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/polaris.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/stampede2.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/summit.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/toss3_llnl.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/vineex_local.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/wqex_local.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/curvezmq.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/data_provider/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/data_provider/data_manager.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/data_provider/file_noop.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/data_provider/files.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/data_provider/ftp.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/data_provider/globus.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/data_provider/http.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/data_provider/rsync.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/data_provider/staging.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/data_provider/zip.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/dataflow/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/dataflow/dependency_resolvers.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/dataflow/errors.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/dataflow/futures.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/dataflow/memoization.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/dataflow/rundirs.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/dataflow/states.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/dataflow/taskrecord.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/errors.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/errors.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/execute_task.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/flux/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/flux/execute_parsl_task.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/flux/executor.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/flux/flux_instance_manager.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/high_throughput/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/high_throughput/errors.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/high_throughput/interchange.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/high_throughput/manager_record.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/high_throughput/manager_selector.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/high_throughput/monitoring_info.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/high_throughput/mpi_executor.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/high_throughput/mpi_prefix_composer.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/high_throughput/mpi_resource_management.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/high_throughput/probe.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/high_throughput/zmq_pipes.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/radical/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/radical/executor.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/radical/rpex_resources.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/radical/rpex_worker.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/status_handling.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/taskvine/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/taskvine/errors.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/taskvine/exec_parsl_function.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/taskvine/executor.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/taskvine/factory.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/taskvine/factory_config.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/taskvine/manager.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/taskvine/manager_config.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/taskvine/utils.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/threads.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/workqueue/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/workqueue/errors.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/workqueue/exec_parsl_function.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/workqueue/executor.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/workqueue/parsl_coprocess.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/jobs/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/jobs/error_handlers.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/jobs/errors.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/jobs/job_status_poller.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/jobs/states.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/jobs/strategy.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/launchers/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/launchers/base.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/launchers/errors.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/launchers/launchers.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/log_utils.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/db_manager.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/errors.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/message_type.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/monitoring.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/queries/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/queries/pandas.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/radios/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/radios/base.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/radios/filesystem_router.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/radios/udp_router.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/radios/zmq.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/radios/zmq_router.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/remote.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/types.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/app.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/models.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/plots/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/plots/default/workflow_plots.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/templates/app.html +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/templates/dag.html +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/templates/error.html +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/templates/layout.html +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/templates/task.html +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/templates/workflow.html +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/utils.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/version.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/views.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/multiprocessing.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/process_loggers.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/aws/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/aws/aws.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/aws/template.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/azure/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/azure/azure.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/azure/template.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/cluster_provider.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/condor/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/condor/condor.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/condor/template.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/errors.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/googlecloud/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/googlecloud/googlecloud.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/grid_engine/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/grid_engine/grid_engine.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/grid_engine/template.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/kubernetes/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/kubernetes/kube.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/kubernetes/template.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/local/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/local/local.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/lsf/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/lsf/lsf.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/lsf/template.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/pbspro/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/pbspro/pbspro.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/pbspro/template.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/slurm/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/slurm/slurm.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/slurm/template.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/torque/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/torque/template.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/torque/torque.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/py.typed +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/serialize/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/serialize/base.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/serialize/concretes.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/serialize/errors.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/serialize/facade.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/serialize/proxystore.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/callables_helper.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/azure_single_node.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/bluewaters.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/bridges.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/cc_in2p3.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/comet.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/ec2_single_node.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/ec2_spot.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/flux_local.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/frontera.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/globus_compute.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/htex_local.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/htex_local_alternate.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/htex_local_intask_staging.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/htex_local_rsync_staging.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/local_radical.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/local_radical_mpi.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/local_threads.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/local_threads_globus.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/midway.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/nscc_singapore.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/osg_htex.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/petrelkube.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/slurm_local.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/summit.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/taskvine_ex.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/user_opts.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/workqueue_ex.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/conftest.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/integration/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/integration/latency.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/integration/test_apps/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/integration/test_stress/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/manual_tests/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/manual_tests/htex_local.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/manual_tests/test_basic.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/manual_tests/test_log_filter.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/manual_tests/test_memory_limits.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/manual_tests/test_regression_220.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/manual_tests/test_worker_count.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/site_tests/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/site_tests/site_config_selector.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/sites/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/sites/test_affinity.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/sites/test_concurrent.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/sites/test_dynamic_executor.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/sites/test_ec2.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/sites/test_launchers.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/sites/test_mpi/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/sites/test_worker_info.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_bash_apps/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_bash_apps/test_basic.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_bash_apps/test_inputs_default.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_bash_apps/test_memoize.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_bash_apps/test_multiline.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_bash_apps/test_pipeline.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_bash_apps/test_std_uri.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_bash_apps/test_stdout.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_callables.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_checkpointing/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_checkpointing/test_periodic.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_checkpointing/test_task_exit.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_curvezmq.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_docs/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_docs/test_from_slides.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_docs/test_kwargs.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_docs/test_workflow1.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_docs/test_workflow4.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_error_handling/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_error_handling/test_fail.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_error_handling/test_python_walltime.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_error_handling/test_resource_spec.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_error_handling/test_retries.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_execute_task.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_flowcontrol/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_flux.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_basic.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_block_manager_selector_unit.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_command_client_timeout.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_command_concurrency_regression_1321.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_connected_blocks.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_cpu_affinity_explicit.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_disconnected_blocks.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_disconnected_blocks_failing_provider.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_drain.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_interchange_exit_bad_registration.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_manager_failure.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_manager_selector_by_block.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_managers_command.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_missing_worker.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_multiple_disconnected_blocks.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_priority_queue.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_resource_spec_validation.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_worker_failure.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_zmq_binding.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_monitoring/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_monitoring/test_app_names.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_monitoring/test_basic.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_monitoring/test_exit_helper.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_monitoring/test_htex_fuzz_zmq.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_monitoring/test_incomplete_futures.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_monitoring/test_memoization_representation.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_monitoring/test_radio_filesystem.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_monitoring/test_radio_multiprocessing.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_monitoring/test_radio_udp.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_monitoring/test_radio_zmq.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_monitoring/test_stdouterr.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_mpi_apps/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_mpi_apps/test_bad_mpi_config.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_mpi_apps/test_mpi_prefix.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_mpi_apps/test_mpi_scheduler.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_mpi_apps/test_mpiex.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_mpi_apps/test_resource_spec.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_providers/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_providers/test_kubernetes_provider.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_providers/test_local_provider.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_providers/test_pbspro_template.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_providers/test_slurm_instantiate.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_providers/test_slurm_template.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_providers/test_submiterror_deprecation.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_basic.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_context_manager.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_dep_standard_futures.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_dependencies_deep.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_depfail_propagation.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_fail.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_futures.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_inputs_default.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_join.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_lifted.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_mapred.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_memoize_exception.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_outputs.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_overview.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_pipeline.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_pluggable_future_resolution.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_simple.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_timeout.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_type5.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_radical/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_radical/test_mpi_funcs.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_regression/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_regression/test_1480.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_regression/test_1653.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_regression/test_221.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_regression/test_226.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_regression/test_2652.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_regression/test_3874.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_regression/test_69a.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_regression/test_97_parallelism_0.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_regression/test_98.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_scaling/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_scaling/test_block_error_handler.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_scaling/test_regression_1621.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_scaling/test_regression_3568_scaledown_vs_MISSING.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_scaling/test_regression_3696_oscillation.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_scaling/test_scale_down.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_scaling/test_shutdown_scalein.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_scaling/test_worker_interchange_bad_messages_3262.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_serialization/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_serialization/test_2555_caching_deserializer.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_serialization/test_3495_deserialize_managerlost.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_serialization/test_basic.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_serialization/test_htex_code_cache.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_serialization/test_proxystore_configured.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_serialization/test_proxystore_impl.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_shutdown/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_shutdown/test_kill_monitoring.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_staging/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_staging/staging_provider.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_staging/test_1316.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_staging/test_docs_1.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_staging/test_docs_2.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_staging/test_file.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_staging/test_file_apps.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_staging/test_file_staging.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_staging/test_output_chain_filenames.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_staging/test_staging_globus.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_staging/test_staging_https.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_staging/test_staging_stdout.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_staging/test_zip_in.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_staging/test_zip_out.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_staging/test_zip_to_zip.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_summary.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_thread_parallelism.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_threads/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_threads/test_configs.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_utils/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_utils/test_execute_wait.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_utils/test_logutils.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_utils/test_representation_mixin.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_utils/test_sanitize_dns.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/unit/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/unit/test_address.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/unit/test_file.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/unit/test_globus_compute_executor.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/unit/test_usage_tracking.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/utils.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/usage_tracking/__init__.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/usage_tracking/api.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/usage_tracking/levels.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/usage_tracking/usage.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl/utils.py +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl.egg-info/dependency_links.txt +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl.egg-info/entry_points.txt +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl.egg-info/requires.txt +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/parsl.egg-info/top_level.txt +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/requirements.txt +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/setup.cfg +0 -0
- {parsl-2025.9.29 → parsl-2025.10.13}/setup.py +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: parsl
|
|
3
|
-
Version: 2025.
|
|
3
|
+
Version: 2025.10.13
|
|
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.13.tar.gz
|
|
7
7
|
Author: The Parsl Team
|
|
8
8
|
Author-email: parsl@googlegroups.com
|
|
9
9
|
License: Apache 2.0
|
|
@@ -6,6 +6,7 @@ from typing import Any, Dict
|
|
|
6
6
|
|
|
7
7
|
import parsl
|
|
8
8
|
from parsl.dataflow.dflow import DataFlowKernel
|
|
9
|
+
from parsl.errors import InternalConsistencyError
|
|
9
10
|
|
|
10
11
|
min_iterations = 2
|
|
11
12
|
|
|
@@ -40,19 +41,18 @@ def app(extra_payload: Any, parsl_resource_specification: Dict = {}) -> int:
|
|
|
40
41
|
return 7
|
|
41
42
|
|
|
42
43
|
|
|
43
|
-
def performance(*, resources: dict, target_t: float, args_extra_size: int) -> None:
|
|
44
|
+
def performance(*, resources: dict, target_t: float, args_extra_size: int, iterate_mode: str) -> None:
|
|
44
45
|
n = 10
|
|
45
46
|
|
|
46
47
|
delta_t: float
|
|
47
|
-
delta_t = 0
|
|
48
|
-
|
|
49
|
-
threshold_t = int(0.75 * target_t)
|
|
50
48
|
|
|
51
49
|
iteration = 1
|
|
52
50
|
|
|
53
51
|
args_extra_payload = "x" * args_extra_size
|
|
54
52
|
|
|
55
|
-
|
|
53
|
+
iterate = True
|
|
54
|
+
|
|
55
|
+
while iterate:
|
|
56
56
|
print(f"==== Iteration {iteration} ====")
|
|
57
57
|
print(f"Will run {n} tasks to target {target_t} seconds runtime")
|
|
58
58
|
start_t = time.time()
|
|
@@ -78,10 +78,20 @@ def performance(*, resources: dict, target_t: float, args_extra_size: int) -> No
|
|
|
78
78
|
print(f"Runtime: actual {delta_t:.3f}s vs target {target_t}s")
|
|
79
79
|
print(f"Tasks per second: {rate:.3f}")
|
|
80
80
|
|
|
81
|
-
n = max(1, int(target_t * rate))
|
|
82
|
-
|
|
83
81
|
iteration += 1
|
|
84
82
|
|
|
83
|
+
# decide upon next iteration
|
|
84
|
+
|
|
85
|
+
match iterate_mode:
|
|
86
|
+
case "estimate":
|
|
87
|
+
n = max(1, int(target_t * rate))
|
|
88
|
+
iterate = delta_t < (0.75 * target_t) or iteration <= min_iterations
|
|
89
|
+
case "exponential":
|
|
90
|
+
n = int(n * 2)
|
|
91
|
+
iterate = delta_t < target_t or iteration <= min_iterations
|
|
92
|
+
case _:
|
|
93
|
+
raise InternalConsistencyError(f"Bad iterate mode {iterate_mode} - should have been validated at arg parse time")
|
|
94
|
+
|
|
85
95
|
|
|
86
96
|
def cli_run() -> None:
|
|
87
97
|
parser = argparse.ArgumentParser(
|
|
@@ -96,6 +106,12 @@ Example usage: python -m parsl.benchmark.perf --config parsl/tests/configs/workq
|
|
|
96
106
|
parser.add_argument("--time", metavar="SECONDS", help="target number of seconds for an iteration", default=120, type=float)
|
|
97
107
|
parser.add_argument("--argsize", metavar="BYTES", help="extra bytes to add into app invocation arguments", default=0, type=int)
|
|
98
108
|
parser.add_argument("--version", action="version", version=f"parsl-perf from Parsl {parsl.__version__}")
|
|
109
|
+
parser.add_argument("--iterate",
|
|
110
|
+
metavar="MODE",
|
|
111
|
+
help="Iteration mode: estimate, exponential",
|
|
112
|
+
type=str,
|
|
113
|
+
default="estimate",
|
|
114
|
+
choices=("estimate", "exponential"))
|
|
99
115
|
|
|
100
116
|
args = parser.parse_args()
|
|
101
117
|
|
|
@@ -105,7 +121,7 @@ Example usage: python -m parsl.benchmark.perf --config parsl/tests/configs/workq
|
|
|
105
121
|
resources = {}
|
|
106
122
|
|
|
107
123
|
with load_dfk_from_config(args.config):
|
|
108
|
-
performance(resources=resources, target_t=args.time, args_extra_size=args.argsize)
|
|
124
|
+
performance(resources=resources, target_t=args.time, args_extra_size=args.argsize, iterate_mode=args.iterate)
|
|
109
125
|
print("Tests complete - leaving DFK block")
|
|
110
126
|
print("The end")
|
|
111
127
|
|
|
@@ -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)
|
|
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
|
|
|
@@ -80,11 +80,11 @@ class ParslExecutor(metaclass=ABCMeta):
|
|
|
80
80
|
self.shutdown()
|
|
81
81
|
return False
|
|
82
82
|
|
|
83
|
-
@abstractmethod
|
|
84
83
|
def start(self) -> None:
|
|
85
84
|
"""Start the executor.
|
|
86
85
|
|
|
87
|
-
|
|
86
|
+
By default, this does nothing, but this method should be overridden to
|
|
87
|
+
perform any spin-up operations (for example: starting thread pools).
|
|
88
88
|
"""
|
|
89
89
|
pass
|
|
90
90
|
|
|
@@ -76,10 +76,6 @@ class GlobusComputeExecutor(ParslExecutor, RepresentationMixin):
|
|
|
76
76
|
self.storage_access = storage_access
|
|
77
77
|
self.working_dir = working_dir
|
|
78
78
|
|
|
79
|
-
def start(self) -> None:
|
|
80
|
-
""" Start the Globus Compute Executor """
|
|
81
|
-
super().start()
|
|
82
|
-
|
|
83
79
|
def submit(self, func: Callable, resource_specification: Dict[str, Any], *args: Any, **kwargs: Any) -> Future:
|
|
84
80
|
""" Submit func to globus-compute
|
|
85
81
|
|
|
@@ -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
|
|
|
@@ -670,7 +676,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
|
|
|
670
676
|
logger.debug("Sending hold to manager: {}".format(manager['manager']))
|
|
671
677
|
self._hold_manager(manager['manager'])
|
|
672
678
|
|
|
673
|
-
def submit(self, func, resource_specification, *args, **kwargs):
|
|
679
|
+
def submit(self, func: Callable, resource_specification: dict, *args, **kwargs) -> HTEXFuture:
|
|
674
680
|
"""Submits work to the outgoing_q.
|
|
675
681
|
|
|
676
682
|
The outgoing_q is an external process listens on this
|
|
@@ -691,21 +697,11 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
|
|
|
691
697
|
|
|
692
698
|
self.validate_resource_spec(resource_specification)
|
|
693
699
|
|
|
694
|
-
if self.bad_state_is_set:
|
|
695
|
-
raise self.executor_exception
|
|
696
|
-
|
|
697
|
-
self._task_counter += 1
|
|
698
|
-
task_id = self._task_counter
|
|
699
|
-
|
|
700
700
|
# handle people sending blobs gracefully
|
|
701
701
|
if logger.getEffectiveLevel() <= logging.DEBUG:
|
|
702
702
|
args_to_print = tuple([ar if len(ar := repr(arg)) < 100 else (ar[:100] + '...') for arg in args])
|
|
703
703
|
logger.debug("Pushing function {} to queue with args {}".format(func, args_to_print))
|
|
704
704
|
|
|
705
|
-
fut = Future()
|
|
706
|
-
fut.parsl_executor_task_id = task_id
|
|
707
|
-
self.tasks[task_id] = fut
|
|
708
|
-
|
|
709
705
|
try:
|
|
710
706
|
fn_buf = pack_apply_message(func, args, kwargs, buffer_threshold=1 << 20)
|
|
711
707
|
except TypeError:
|
|
@@ -715,12 +711,69 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
|
|
|
715
711
|
if resource_specification:
|
|
716
712
|
context["resource_spec"] = resource_specification
|
|
717
713
|
|
|
718
|
-
|
|
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
|
|
719
773
|
|
|
720
|
-
|
|
774
|
+
msg = {"task_id": task_id, "context": context, "buffer": buffer}
|
|
721
775
|
self.outgoing_q.put(msg)
|
|
722
776
|
|
|
723
|
-
# Return the future
|
|
724
777
|
return fut
|
|
725
778
|
|
|
726
779
|
@property
|
|
@@ -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
|
|
@@ -378,7 +379,7 @@ class Manager:
|
|
|
378
379
|
last_interchange_contact = time.time()
|
|
379
380
|
|
|
380
381
|
if tasks == HEARTBEAT_CODE:
|
|
381
|
-
logger.debug("Got heartbeat from interchange")
|
|
382
|
+
logger.debug("Got heartbeat response from interchange")
|
|
382
383
|
elif tasks == DRAINED_CODE:
|
|
383
384
|
logger.info("Got fully drained message from interchange - setting kill flag")
|
|
384
385
|
self._stop_event.set()
|
|
@@ -778,8 +779,20 @@ def worker(
|
|
|
778
779
|
|
|
779
780
|
_init_mpi_env(mpi_launcher=mpi_launcher, resource_spec=res_spec)
|
|
780
781
|
|
|
782
|
+
exec_func: Callable = execute_task
|
|
783
|
+
exec_args = ()
|
|
784
|
+
exec_kwargs = {}
|
|
785
|
+
|
|
781
786
|
try:
|
|
782
|
-
|
|
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)
|
|
783
796
|
serialized_result = serialize(result, buffer_threshold=1000000)
|
|
784
797
|
except Exception as e:
|
|
785
798
|
logger.info('Caught an exception: {}'.format(e))
|
|
@@ -10,11 +10,12 @@ from parsl.monitoring.radios.base import (
|
|
|
10
10
|
RadioConfig,
|
|
11
11
|
)
|
|
12
12
|
from parsl.monitoring.radios.filesystem_router import FilesystemRadioReceiver
|
|
13
|
+
from parsl.utils import RepresentationMixin
|
|
13
14
|
|
|
14
15
|
logger = logging.getLogger(__name__)
|
|
15
16
|
|
|
16
17
|
|
|
17
|
-
class FilesystemRadio(RadioConfig):
|
|
18
|
+
class FilesystemRadio(RadioConfig, RepresentationMixin):
|
|
18
19
|
"""A MonitoringRadioSender that sends messages over a shared filesystem.
|
|
19
20
|
|
|
20
21
|
The messsage directory structure is based on maildir,
|
|
@@ -7,11 +7,12 @@ from parsl.monitoring.radios.base import (
|
|
|
7
7
|
MonitoringRadioSender,
|
|
8
8
|
RadioConfig,
|
|
9
9
|
)
|
|
10
|
+
from parsl.utils import RepresentationMixin
|
|
10
11
|
|
|
11
12
|
logger = logging.getLogger(__name__)
|
|
12
13
|
|
|
13
14
|
|
|
14
|
-
class HTEXRadio(RadioConfig):
|
|
15
|
+
class HTEXRadio(RadioConfig, RepresentationMixin):
|
|
15
16
|
def create_sender(self) -> MonitoringRadioSender:
|
|
16
17
|
return HTEXRadioSender()
|
|
17
18
|
|
|
@@ -5,9 +5,10 @@ from parsl.monitoring.radios.base import (
|
|
|
5
5
|
MonitoringRadioSender,
|
|
6
6
|
RadioConfig,
|
|
7
7
|
)
|
|
8
|
+
from parsl.utils import RepresentationMixin
|
|
8
9
|
|
|
9
10
|
|
|
10
|
-
class MultiprocessingQueueRadioSender(MonitoringRadioSender):
|
|
11
|
+
class MultiprocessingQueueRadioSender(MonitoringRadioSender, RepresentationMixin):
|
|
11
12
|
"""A monitoring radio which connects over a multiprocessing Queue.
|
|
12
13
|
This radio is intended to be used on the submit side, where components
|
|
13
14
|
in the submit process, or processes launched by multiprocessing, will have
|
|
@@ -13,11 +13,12 @@ from parsl.monitoring.radios.base import (
|
|
|
13
13
|
RadioConfig,
|
|
14
14
|
)
|
|
15
15
|
from parsl.monitoring.radios.udp_router import start_udp_receiver
|
|
16
|
+
from parsl.utils import RepresentationMixin
|
|
16
17
|
|
|
17
18
|
logger = logging.getLogger(__name__)
|
|
18
19
|
|
|
19
20
|
|
|
20
|
-
class UDPRadio(RadioConfig):
|
|
21
|
+
class UDPRadio(RadioConfig, RepresentationMixin):
|
|
21
22
|
def __init__(self, *, port: Optional[int] = None, atexit_timeout: int = 3, address: str, debug: bool = False, hmac_digest: str = 'sha512'):
|
|
22
23
|
self.port = port
|
|
23
24
|
self.atexit_timeout = atexit_timeout
|
|
@@ -33,7 +33,28 @@ class ExecutionProvider(metaclass=ABCMeta):
|
|
|
33
33
|
[cancel] <--------|----+
|
|
34
34
|
|
|
|
35
35
|
+-------------------
|
|
36
|
-
|
|
36
|
+
|
|
37
|
+
In addition to the listed methods, an ExecutionProvider instance must always
|
|
38
|
+
have these attributes, which both default to `None`:
|
|
39
|
+
|
|
40
|
+
mem_per_node: Real memory to provision per node in GB.
|
|
41
|
+
|
|
42
|
+
Providers which set this attribute should ask for mem_per_node of memory
|
|
43
|
+
when provisioning resources, and set the corresponding environment
|
|
44
|
+
variable PARSL_MEMORY_GB before executing submitted commands.
|
|
45
|
+
|
|
46
|
+
If this attribute is set, executors may use it to calculate how many tasks can
|
|
47
|
+
run concurrently per node.
|
|
48
|
+
|
|
49
|
+
cores_per_node: Number of cores to provision per node.
|
|
50
|
+
|
|
51
|
+
Providers which set this attribute should ask for cores_per_node cores
|
|
52
|
+
when provisioning resources, and set the corresponding environment
|
|
53
|
+
variable PARSL_CORES before executing submitted commands.
|
|
54
|
+
|
|
55
|
+
If this attribute is set, executors may use it to calculate how many tasks can
|
|
56
|
+
run concurrently per node.
|
|
57
|
+
"""
|
|
37
58
|
|
|
38
59
|
@abstractmethod
|
|
39
60
|
def __init__(self) -> None:
|
|
@@ -44,8 +65,8 @@ class ExecutionProvider(metaclass=ABCMeta):
|
|
|
44
65
|
self.script_dir: Optional[str]
|
|
45
66
|
self.parallelism: float
|
|
46
67
|
self.resources: Dict[object, Any]
|
|
47
|
-
self.
|
|
48
|
-
self.
|
|
68
|
+
self.cores_per_node: Optional[int] = None
|
|
69
|
+
self.mem_per_node: Optional[float] = None
|
|
49
70
|
pass
|
|
50
71
|
|
|
51
72
|
@abstractmethod
|
|
@@ -111,40 +132,6 @@ class ExecutionProvider(metaclass=ABCMeta):
|
|
|
111
132
|
''' Provides the label for this provider '''
|
|
112
133
|
pass
|
|
113
134
|
|
|
114
|
-
@property
|
|
115
|
-
def mem_per_node(self) -> Optional[float]:
|
|
116
|
-
"""Real memory to provision per node in GB.
|
|
117
|
-
|
|
118
|
-
Providers which set this property should ask for mem_per_node of memory
|
|
119
|
-
when provisioning resources, and set the corresponding environment
|
|
120
|
-
variable PARSL_MEMORY_GB before executing submitted commands.
|
|
121
|
-
|
|
122
|
-
If this property is set, executors may use it to calculate how many tasks can
|
|
123
|
-
run concurrently per node.
|
|
124
|
-
"""
|
|
125
|
-
return self._mem_per_node
|
|
126
|
-
|
|
127
|
-
@mem_per_node.setter
|
|
128
|
-
def mem_per_node(self, value: float) -> None:
|
|
129
|
-
self._mem_per_node = value
|
|
130
|
-
|
|
131
|
-
@property
|
|
132
|
-
def cores_per_node(self) -> Optional[int]:
|
|
133
|
-
"""Number of cores to provision per node.
|
|
134
|
-
|
|
135
|
-
Providers which set this property should ask for cores_per_node cores
|
|
136
|
-
when provisioning resources, and set the corresponding environment
|
|
137
|
-
variable PARSL_CORES before executing submitted commands.
|
|
138
|
-
|
|
139
|
-
If this property is set, executors may use it to calculate how many tasks can
|
|
140
|
-
run concurrently per node.
|
|
141
|
-
"""
|
|
142
|
-
return self._cores_per_node
|
|
143
|
-
|
|
144
|
-
@cores_per_node.setter
|
|
145
|
-
def cores_per_node(self, value: int) -> None:
|
|
146
|
-
self._cores_per_node = value
|
|
147
|
-
|
|
148
135
|
@property
|
|
149
136
|
@abstractmethod
|
|
150
137
|
def status_polling_interval(self) -> int:
|
|
@@ -7,6 +7,7 @@ from unittest import mock
|
|
|
7
7
|
import pytest
|
|
8
8
|
|
|
9
9
|
from parsl import HighThroughputExecutor, curvezmq
|
|
10
|
+
from parsl.serialize.facade import pack_apply_message, unpack_apply_message
|
|
10
11
|
|
|
11
12
|
_MOCK_BASE = "parsl.executors.high_throughput.executor"
|
|
12
13
|
|
|
@@ -19,11 +20,16 @@ def encrypted(request: pytest.FixtureRequest):
|
|
|
19
20
|
|
|
20
21
|
|
|
21
22
|
@pytest.fixture
|
|
22
|
-
def htex(encrypted: bool):
|
|
23
|
+
def htex(encrypted: bool, tmpd_cwd):
|
|
23
24
|
htex = HighThroughputExecutor(encrypted=encrypted)
|
|
25
|
+
htex.max_workers_per_node = 1
|
|
26
|
+
htex.run_dir = tmpd_cwd
|
|
27
|
+
htex.provider.script_dir = tmpd_cwd
|
|
24
28
|
|
|
25
29
|
yield htex
|
|
26
30
|
|
|
31
|
+
if hasattr(htex, "outgoing_q"):
|
|
32
|
+
htex.scale_in(blocks=1000)
|
|
27
33
|
htex.shutdown()
|
|
28
34
|
|
|
29
35
|
|
|
@@ -146,3 +152,32 @@ def test_htex_interchange_launch_cmd(cmd: Optional[Sequence[str]]):
|
|
|
146
152
|
else:
|
|
147
153
|
htex = HighThroughputExecutor()
|
|
148
154
|
assert htex.interchange_launch_cmd == ["interchange.py"]
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def dyn_exec(buf, *vec_y):
|
|
158
|
+
f, a, _ = unpack_apply_message(buf)
|
|
159
|
+
custom_args = [a, vec_y]
|
|
160
|
+
return f(*custom_args)
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
@pytest.mark.local
|
|
164
|
+
def test_worker_dynamic_import(htex: HighThroughputExecutor):
|
|
165
|
+
def _dot_prod(vec_x, vec_y):
|
|
166
|
+
return sum(x * y for x, y in zip(vec_x, vec_y))
|
|
167
|
+
|
|
168
|
+
htex.start()
|
|
169
|
+
htex.scale_out_facade(1)
|
|
170
|
+
|
|
171
|
+
num_array = tuple(range(10))
|
|
172
|
+
|
|
173
|
+
fn_buf = pack_apply_message(_dot_prod, num_array, {})
|
|
174
|
+
ctxt = {
|
|
175
|
+
"task_executor": {
|
|
176
|
+
"f": f"{dyn_exec.__module__}.{dyn_exec.__name__}",
|
|
177
|
+
"a": num_array, # prove "custom" dyn_exec
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
val = htex.submit_payload(ctxt, fn_buf).result()
|
|
181
|
+
exp_val = _dot_prod(num_array, num_array)
|
|
182
|
+
|
|
183
|
+
assert val == exp_val
|
|
@@ -27,10 +27,5 @@ def test_garbage_collect():
|
|
|
27
27
|
|
|
28
28
|
evt.set()
|
|
29
29
|
assert x.result() == 10 * 4
|
|
30
|
-
|
|
31
|
-
# We explicit call checkpoint if checkpoint_mode is enabled covering
|
|
32
|
-
# cases like manual/periodic where checkpointing may be deferred.
|
|
33
|
-
parsl.dfk().checkpoint()
|
|
34
|
-
|
|
35
|
-
time.sleep(0.01) # Give enough time for task wipes to work
|
|
30
|
+
time.sleep(0.01) # Give enough time for task wipes to work - see issue #1279
|
|
36
31
|
assert x.tid not in parsl.dfk().tasks, "Task record should be wiped after task completion"
|
|
@@ -4,7 +4,17 @@ import pytest
|
|
|
4
4
|
|
|
5
5
|
import parsl
|
|
6
6
|
from parsl.app.app import python_app
|
|
7
|
-
from parsl.
|
|
7
|
+
from parsl.config import Config
|
|
8
|
+
from parsl.executors.threads import ThreadPoolExecutor
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def local_config():
|
|
12
|
+
return Config(
|
|
13
|
+
executors=[
|
|
14
|
+
ThreadPoolExecutor(max_threads=4),
|
|
15
|
+
],
|
|
16
|
+
app_cache=False
|
|
17
|
+
)
|
|
8
18
|
|
|
9
19
|
|
|
10
20
|
@python_app
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: parsl
|
|
3
|
-
Version: 2025.
|
|
3
|
+
Version: 2025.10.13
|
|
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.13.tar.gz
|
|
7
7
|
Author: The Parsl Team
|
|
8
8
|
Author-email: parsl@googlegroups.com
|
|
9
9
|
License: Apache 2.0
|
|
@@ -241,7 +241,6 @@ parsl/tests/configs/local_threads_checkpoint_task_exit.py
|
|
|
241
241
|
parsl/tests/configs/local_threads_ftp_in_task.py
|
|
242
242
|
parsl/tests/configs/local_threads_globus.py
|
|
243
243
|
parsl/tests/configs/local_threads_http_in_task.py
|
|
244
|
-
parsl/tests/configs/local_threads_no_cache.py
|
|
245
244
|
parsl/tests/configs/midway.py
|
|
246
245
|
parsl/tests/configs/nscc_singapore.py
|
|
247
246
|
parsl/tests/configs/osg_htex.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|