parsl 2025.7.28__tar.gz → 2025.8.11__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.7.28/parsl.egg-info → parsl-2025.8.11}/PKG-INFO +2 -2
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/dataflow/dflow.py +12 -2
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/high_throughput/executor.py +0 -2
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/status_handling.py +1 -1
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/taskvine/executor.py +1 -2
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/workqueue/executor.py +1 -2
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/jobs/strategy.py +2 -2
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/log_utils.py +21 -3
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/db_manager.py +9 -11
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/manual_tests/test_memory_limits.py +1 -1
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/site_tests/test_site.py +3 -3
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_scaling/test_regression_3696_oscillation.py +2 -2
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_scaling/test_scale_down.py +2 -2
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +2 -2
- parsl-2025.8.11/parsl/tests/test_utils/test_logutils.py +70 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_utils/test_representation_mixin.py +33 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/version.py +1 -1
- {parsl-2025.7.28 → parsl-2025.8.11/parsl.egg-info}/PKG-INFO +2 -2
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl.egg-info/SOURCES.txt +1 -8
- parsl-2025.7.28/parsl/tests/scaling_tests/htex_local.py +0 -20
- parsl-2025.7.28/parsl/tests/scaling_tests/local_threads.py +0 -4
- parsl-2025.7.28/parsl/tests/scaling_tests/test_scale.py +0 -135
- parsl-2025.7.28/parsl/tests/scaling_tests/vineex_condor.py +0 -9
- parsl-2025.7.28/parsl/tests/scaling_tests/vineex_local.py +0 -10
- parsl-2025.7.28/parsl/tests/scaling_tests/wqex_condor.py +0 -12
- parsl-2025.7.28/parsl/tests/scaling_tests/wqex_local.py +0 -12
- parsl-2025.7.28/parsl/usage_tracking/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/LICENSE +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/MANIFEST.in +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/README.rst +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/addresses.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/app/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/app/app.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/app/bash.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/app/errors.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/app/futures.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/app/python.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/benchmark/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/benchmark/perf.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/concurrent/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/config.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/ASPIRE1.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/Azure.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/anvil.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/bridges.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/cc_in2p3.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/delta.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/ec2.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/expanse.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/frontera.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/gc_multisite.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/gc_tutorial.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/htex_local.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/illinoiscluster.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/improv.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/kubernetes.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/local_threads.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/midway.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/osg.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/polaris.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/stampede2.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/summit.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/toss3_llnl.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/vineex_local.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/configs/wqex_local.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/curvezmq.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/data_provider/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/data_provider/data_manager.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/data_provider/file_noop.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/data_provider/files.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/data_provider/ftp.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/data_provider/globus.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/data_provider/http.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/data_provider/rsync.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/data_provider/staging.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/data_provider/zip.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/dataflow/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/dataflow/dependency_resolvers.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/dataflow/errors.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/dataflow/futures.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/dataflow/memoization.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/dataflow/rundirs.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/dataflow/states.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/dataflow/taskrecord.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/errors.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/base.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/errors.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/execute_task.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/flux/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/flux/execute_parsl_task.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/flux/executor.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/flux/flux_instance_manager.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/globus_compute.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/high_throughput/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/high_throughput/errors.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/high_throughput/interchange.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/high_throughput/manager_record.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/high_throughput/manager_selector.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/high_throughput/monitoring_info.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/high_throughput/mpi_executor.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/high_throughput/mpi_prefix_composer.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/high_throughput/mpi_resource_management.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/high_throughput/probe.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/high_throughput/process_worker_pool.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/high_throughput/zmq_pipes.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/radical/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/radical/executor.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/radical/rpex_resources.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/radical/rpex_worker.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/taskvine/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/taskvine/errors.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/taskvine/exec_parsl_function.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/taskvine/factory.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/taskvine/factory_config.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/taskvine/manager.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/taskvine/manager_config.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/taskvine/utils.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/threads.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/workqueue/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/workqueue/errors.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/workqueue/exec_parsl_function.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/workqueue/parsl_coprocess.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/jobs/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/jobs/error_handlers.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/jobs/errors.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/jobs/job_status_poller.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/jobs/states.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/launchers/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/launchers/base.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/launchers/errors.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/launchers/launchers.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/errors.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/message_type.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/monitoring.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/queries/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/queries/pandas.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/radios/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/radios/base.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/radios/filesystem.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/radios/filesystem_router.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/radios/htex.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/radios/multiprocessing.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/radios/udp.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/radios/udp_router.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/radios/zmq.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/radios/zmq_router.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/remote.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/types.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/app.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/models.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/plots/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/plots/default/workflow_plots.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/templates/app.html +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/templates/dag.html +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/templates/error.html +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/templates/layout.html +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/templates/task.html +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/templates/workflow.html +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/utils.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/version.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/monitoring/visualization/views.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/multiprocessing.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/process_loggers.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/aws/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/aws/aws.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/aws/template.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/azure/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/azure/azure.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/azure/template.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/base.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/cluster_provider.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/condor/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/condor/condor.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/condor/template.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/errors.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/googlecloud/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/googlecloud/googlecloud.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/grid_engine/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/grid_engine/grid_engine.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/grid_engine/template.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/kubernetes/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/kubernetes/kube.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/kubernetes/template.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/local/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/local/local.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/lsf/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/lsf/lsf.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/lsf/template.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/pbspro/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/pbspro/pbspro.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/pbspro/template.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/slurm/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/slurm/slurm.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/slurm/template.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/torque/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/torque/template.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/providers/torque/torque.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/py.typed +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/serialize/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/serialize/base.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/serialize/concretes.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/serialize/errors.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/serialize/facade.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/serialize/proxystore.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/callables_helper.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/azure_single_node.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/bluewaters.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/bridges.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/cc_in2p3.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/comet.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/ec2_single_node.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/ec2_spot.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/flux_local.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/frontera.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/globus_compute.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/htex_local.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/htex_local_alternate.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/htex_local_intask_staging.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/htex_local_rsync_staging.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/local_radical.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/local_radical_mpi.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/local_threads.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/local_threads_checkpoint_periodic.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/local_threads_globus.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/local_threads_no_cache.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/midway.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/nscc_singapore.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/osg_htex.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/petrelkube.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/slurm_local.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/summit.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/taskvine_ex.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/user_opts.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/configs/workqueue_ex.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/conftest.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/integration/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/integration/latency.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/integration/test_apps/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/integration/test_stress/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/manual_tests/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/manual_tests/htex_local.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/manual_tests/test_basic.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/manual_tests/test_log_filter.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/manual_tests/test_regression_220.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/manual_tests/test_worker_count.py +0 -0
- {parsl-2025.7.28/parsl/tests/scaling_tests → parsl-2025.8.11/parsl/tests/site_tests}/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/site_tests/site_config_selector.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/site_tests/test_provider.py +0 -0
- {parsl-2025.7.28/parsl/tests/site_tests → parsl-2025.8.11/parsl/tests/sites}/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/sites/test_affinity.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/sites/test_concurrent.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/sites/test_dynamic_executor.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/sites/test_ec2.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/sites/test_launchers.py +0 -0
- {parsl-2025.7.28/parsl/tests/sites → parsl-2025.8.11/parsl/tests/sites/test_mpi}/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/sites/test_worker_info.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_aalst_patterns.py +0 -0
- {parsl-2025.7.28/parsl/tests/sites/test_mpi → parsl-2025.8.11/parsl/tests/test_bash_apps}/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_bash_apps/test_basic.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_bash_apps/test_inputs_default.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_bash_apps/test_memoize.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_bash_apps/test_multiline.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_bash_apps/test_pipeline.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_bash_apps/test_std_uri.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_bash_apps/test_stdout.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_callables.py +0 -0
- {parsl-2025.7.28/parsl/tests/test_bash_apps → parsl-2025.8.11/parsl/tests/test_checkpointing}/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_checkpointing/test_periodic.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_checkpointing/test_regression_233.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_checkpointing/test_task_exit.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_curvezmq.py +0 -0
- {parsl-2025.7.28/parsl/tests/test_checkpointing → parsl-2025.8.11/parsl/tests/test_docs}/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_docs/test_from_slides.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_docs/test_kwargs.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_docs/test_workflow1.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_docs/test_workflow2.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_docs/test_workflow4.py +0 -0
- {parsl-2025.7.28/parsl/tests/test_docs → parsl-2025.8.11/parsl/tests/test_error_handling}/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_error_handling/test_fail.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_error_handling/test_python_walltime.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_error_handling/test_rand_fail.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_error_handling/test_resource_spec.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_error_handling/test_retries.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_execute_task.py +0 -0
- {parsl-2025.7.28/parsl/tests/test_error_handling → parsl-2025.8.11/parsl/tests/test_flowcontrol}/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_flux.py +0 -0
- {parsl-2025.7.28/parsl/tests/test_flowcontrol → parsl-2025.8.11/parsl/tests/test_htex}/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_basic.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_block_manager_selector_unit.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_command_client_timeout.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_connected_blocks.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_cpu_affinity_explicit.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_disconnected_blocks.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_disconnected_blocks_failing_provider.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_drain.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_htex.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_interchange_exit_bad_registration.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_manager_failure.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_manager_selector_by_block.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_managers_command.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_missing_worker.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_multiple_disconnected_blocks.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_priority_queue.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_resource_spec_validation.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_worker_failure.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_htex/test_zmq_binding.py +0 -0
- {parsl-2025.7.28/parsl/tests/test_htex → parsl-2025.8.11/parsl/tests/test_monitoring}/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_monitoring/test_app_names.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_monitoring/test_basic.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_monitoring/test_exit_helper.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_monitoring/test_htex_fuzz_zmq.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_monitoring/test_incomplete_futures.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_monitoring/test_memoization_representation.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_monitoring/test_radio_filesystem.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_monitoring/test_radio_multiprocessing.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_monitoring/test_radio_udp.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_monitoring/test_radio_zmq.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_monitoring/test_stdouterr.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
- {parsl-2025.7.28/parsl/tests/test_monitoring → parsl-2025.8.11/parsl/tests/test_mpi_apps}/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_mpi_apps/test_bad_mpi_config.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_mpi_apps/test_mpi_prefix.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_mpi_apps/test_mpi_scheduler.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_mpi_apps/test_mpiex.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_mpi_apps/test_resource_spec.py +0 -0
- {parsl-2025.7.28/parsl/tests/test_mpi_apps → parsl-2025.8.11/parsl/tests/test_providers}/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_providers/test_kubernetes_provider.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_providers/test_local_provider.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_providers/test_pbspro_template.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_providers/test_slurm_instantiate.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_providers/test_slurm_template.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_providers/test_submiterror_deprecation.py +0 -0
- {parsl-2025.7.28/parsl/tests/test_providers → parsl-2025.8.11/parsl/tests/test_python_apps}/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_basic.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_context_manager.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_dep_standard_futures.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_dependencies_deep.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_depfail_propagation.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_fail.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_futures.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_garbage_collect.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_inputs_default.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_join.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_lifted.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_mapred.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_memoize_2.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_outputs.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_overview.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_pipeline.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_pluggable_future_resolution.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_simple.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_timeout.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_python_apps/test_type5.py +0 -0
- {parsl-2025.7.28/parsl/tests/test_python_apps → parsl-2025.8.11/parsl/tests/test_radical}/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_radical/test_mpi_funcs.py +0 -0
- {parsl-2025.7.28/parsl/tests/test_radical → parsl-2025.8.11/parsl/tests/test_regression}/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_regression/test_1480.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_regression/test_1653.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_regression/test_221.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_regression/test_226.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_regression/test_2652.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_regression/test_69a.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_regression/test_854.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_regression/test_97_parallelism_0.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_regression/test_98.py +0 -0
- {parsl-2025.7.28/parsl/tests/test_regression → parsl-2025.8.11/parsl/tests/test_scaling}/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_scaling/test_block_error_handler.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_scaling/test_regression_1621.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_scaling/test_regression_3568_scaledown_vs_MISSING.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_scaling/test_shutdown_scalein.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_scaling/test_worker_interchange_bad_messages_3262.py +0 -0
- {parsl-2025.7.28/parsl/tests/test_scaling → parsl-2025.8.11/parsl/tests/test_serialization}/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_serialization/test_2555_caching_deserializer.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_serialization/test_3495_deserialize_managerlost.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_serialization/test_basic.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_serialization/test_htex_code_cache.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_serialization/test_pack_resource_spec.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_serialization/test_proxystore_configured.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_serialization/test_proxystore_impl.py +0 -0
- {parsl-2025.7.28/parsl/tests/test_serialization → parsl-2025.8.11/parsl/tests/test_shutdown}/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_shutdown/test_kill_monitoring.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_staging/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_staging/staging_provider.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_staging/test_1316.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_staging/test_docs_1.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_staging/test_docs_2.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_staging/test_file.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_staging/test_file_apps.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_staging/test_file_staging.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_staging/test_output_chain_filenames.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_staging/test_staging_globus.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_staging/test_staging_https.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_staging/test_staging_stdout.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_staging/test_zip_in.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_staging/test_zip_out.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_staging/test_zip_to_zip.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_summary.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_thread_parallelism.py +0 -0
- {parsl-2025.7.28/parsl/tests/test_shutdown → parsl-2025.8.11/parsl/tests/test_threads}/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_threads/test_configs.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
- {parsl-2025.7.28/parsl/tests/test_threads → parsl-2025.8.11/parsl/tests/test_utils}/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_utils/test_execute_wait.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_utils/test_sanitize_dns.py +0 -0
- {parsl-2025.7.28/parsl/tests/test_utils → parsl-2025.8.11/parsl/tests/unit}/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/unit/test_address.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/unit/test_file.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/unit/test_globus_compute_executor.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/unit/test_usage_tracking.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/utils.py +0 -0
- {parsl-2025.7.28/parsl/tests/unit → parsl-2025.8.11/parsl/usage_tracking}/__init__.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/usage_tracking/api.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/usage_tracking/levels.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/usage_tracking/usage.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl/utils.py +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl.egg-info/dependency_links.txt +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl.egg-info/entry_points.txt +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl.egg-info/requires.txt +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/parsl.egg-info/top_level.txt +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/requirements.txt +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/setup.cfg +0 -0
- {parsl-2025.7.28 → parsl-2025.8.11}/setup.py +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: parsl
|
|
3
|
-
Version: 2025.
|
|
3
|
+
Version: 2025.8.11
|
|
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.08.11.tar.gz
|
|
7
7
|
Author: The Parsl Team
|
|
8
8
|
Author-email: parsl@googlegroups.com
|
|
9
9
|
License: Apache 2.0
|
|
@@ -91,8 +91,11 @@ class DataFlowKernel:
|
|
|
91
91
|
self._config = config
|
|
92
92
|
self.run_dir = make_rundir(config.run_dir)
|
|
93
93
|
|
|
94
|
+
self._logging_unregister_callback: Optional[Callable[[], None]]
|
|
94
95
|
if config.initialize_logging:
|
|
95
|
-
parsl.set_file_logger("{}/parsl.log".format(self.run_dir), level=logging.DEBUG)
|
|
96
|
+
self._logging_unregister_callback = parsl.set_file_logger("{}/parsl.log".format(self.run_dir), level=logging.DEBUG)
|
|
97
|
+
else:
|
|
98
|
+
self._logging_unregister_callback = None
|
|
96
99
|
|
|
97
100
|
logger.info("Starting DataFlowKernel with config\n{}".format(config))
|
|
98
101
|
|
|
@@ -1139,7 +1142,7 @@ class DataFlowKernel:
|
|
|
1139
1142
|
executor.monitoring_messages = self.monitoring.resource_msgs
|
|
1140
1143
|
logger.debug("Starting monitoring receiver for executor %s "
|
|
1141
1144
|
"with remote monitoring radio config %s",
|
|
1142
|
-
executor, executor.remote_monitoring_radio)
|
|
1145
|
+
executor.label, executor.remote_monitoring_radio)
|
|
1143
1146
|
|
|
1144
1147
|
executor.monitoring_receiver = executor.remote_monitoring_radio.create_receiver(resource_msgs=executor.monitoring_messages,
|
|
1145
1148
|
run_dir=executor.run_dir)
|
|
@@ -1255,6 +1258,13 @@ class DataFlowKernel:
|
|
|
1255
1258
|
else:
|
|
1256
1259
|
logger.debug("Cleaning up non-default DFK - not unregistering")
|
|
1257
1260
|
|
|
1261
|
+
if self._logging_unregister_callback:
|
|
1262
|
+
logger.info("Unregistering log handler")
|
|
1263
|
+
self._logging_unregister_callback()
|
|
1264
|
+
logger.info("Unregistered log handler")
|
|
1265
|
+
|
|
1266
|
+
# This message won't go to the default parsl.log, but other handlers
|
|
1267
|
+
# should still see it.
|
|
1258
1268
|
logger.info("DFK cleanup complete")
|
|
1259
1269
|
|
|
1260
1270
|
def checkpoint(self, tasks: Optional[Sequence[TaskRecord]] = None) -> str:
|
|
@@ -621,13 +621,11 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
|
|
|
621
621
|
self.command_client.run("HOLD_WORKER;{}".format(manager_id))
|
|
622
622
|
logger.debug("Sent hold request to manager: {}".format(manager_id))
|
|
623
623
|
|
|
624
|
-
@property
|
|
625
624
|
def outstanding(self) -> int:
|
|
626
625
|
"""Returns the count of tasks outstanding across the interchange
|
|
627
626
|
and managers"""
|
|
628
627
|
return len(self.tasks)
|
|
629
628
|
|
|
630
|
-
@property
|
|
631
629
|
def connected_workers(self) -> int:
|
|
632
630
|
"""Returns the count of workers across all connected managers"""
|
|
633
631
|
return self.command_client.run("WORKERS")
|
|
@@ -122,7 +122,7 @@ class BlockProviderExecutor(ParslExecutor):
|
|
|
122
122
|
else:
|
|
123
123
|
return self._provider.status_polling_interval
|
|
124
124
|
|
|
125
|
-
@
|
|
125
|
+
@abstractmethod
|
|
126
126
|
def outstanding(self) -> int:
|
|
127
127
|
"""This should return the number of tasks that the executor has been given to run (waiting to run, and running now)"""
|
|
128
128
|
|
|
@@ -573,7 +573,6 @@ class TaskVineExecutor(BlockProviderExecutor, putils.RepresentationMixin):
|
|
|
573
573
|
self._worker_command = self._construct_worker_command()
|
|
574
574
|
self._patch_providers()
|
|
575
575
|
|
|
576
|
-
@property
|
|
577
576
|
def outstanding(self) -> int:
|
|
578
577
|
"""Count the number of outstanding tasks."""
|
|
579
578
|
logger.debug(f"Counted {self._outstanding_tasks} outstanding tasks")
|
|
@@ -659,7 +658,7 @@ class TaskVineExecutor(BlockProviderExecutor, putils.RepresentationMixin):
|
|
|
659
658
|
with self._outstanding_tasks_lock:
|
|
660
659
|
self._outstanding_tasks -= 1
|
|
661
660
|
finally:
|
|
662
|
-
logger.debug(f"Marking all {self.outstanding} outstanding tasks as failed")
|
|
661
|
+
logger.debug(f"Marking all {self.outstanding()} outstanding tasks as failed")
|
|
663
662
|
logger.debug("Acquiring tasks_lock")
|
|
664
663
|
with self._tasks_lock:
|
|
665
664
|
logger.debug("Acquired tasks_lock")
|
|
@@ -674,7 +674,6 @@ class WorkQueueExecutor(BlockProviderExecutor, putils.RepresentationMixin):
|
|
|
674
674
|
self.worker_command = self._construct_worker_command()
|
|
675
675
|
self._patch_providers()
|
|
676
676
|
|
|
677
|
-
@property
|
|
678
677
|
def outstanding(self) -> int:
|
|
679
678
|
"""Count the number of outstanding slots required. This is inefficiently
|
|
680
679
|
implemented and probably could be replaced with a counter.
|
|
@@ -983,7 +982,7 @@ def _work_queue_submit_wait(*,
|
|
|
983
982
|
continue
|
|
984
983
|
# When a task is found:
|
|
985
984
|
executor_task_id = t.tag
|
|
986
|
-
logger.
|
|
985
|
+
logger.info("Completed Work Queue task {}, executor task {}".format(t.id, t.tag))
|
|
987
986
|
result_file = result_file_of_task_id.pop(t.tag)
|
|
988
987
|
|
|
989
988
|
# A tasks completes 'succesfully' if it has result file.
|
|
@@ -193,7 +193,7 @@ class Strategy:
|
|
|
193
193
|
self.executors[label]['first'] = False
|
|
194
194
|
|
|
195
195
|
# Tasks that are either pending completion
|
|
196
|
-
active_tasks = executor.outstanding
|
|
196
|
+
active_tasks = executor.outstanding()
|
|
197
197
|
|
|
198
198
|
status = executor.status_facade
|
|
199
199
|
|
|
@@ -215,7 +215,7 @@ class Strategy:
|
|
|
215
215
|
|
|
216
216
|
if hasattr(executor, 'connected_workers'):
|
|
217
217
|
logger.debug('Executor {} has {} active tasks, {}/{} running/pending blocks, and {} connected workers'.format(
|
|
218
|
-
label, active_tasks, running, pending, executor.connected_workers))
|
|
218
|
+
label, active_tasks, running, pending, executor.connected_workers()))
|
|
219
219
|
else:
|
|
220
220
|
logger.debug('Executor {} has {} active tasks and {}/{} running/pending blocks'.format(
|
|
221
221
|
label, active_tasks, running, pending))
|
|
@@ -7,7 +7,7 @@ when working in a Jupyter notebook.
|
|
|
7
7
|
"""
|
|
8
8
|
import io
|
|
9
9
|
import logging
|
|
10
|
-
from typing import Optional
|
|
10
|
+
from typing import Callable, Optional
|
|
11
11
|
|
|
12
12
|
import typeguard
|
|
13
13
|
|
|
@@ -22,7 +22,7 @@ DEFAULT_FORMAT = (
|
|
|
22
22
|
def set_stream_logger(name: str = 'parsl',
|
|
23
23
|
level: int = logging.DEBUG,
|
|
24
24
|
format_string: Optional[str] = None,
|
|
25
|
-
stream: Optional[io.
|
|
25
|
+
stream: Optional[io.TextIOBase] = None) -> Callable[[], None]:
|
|
26
26
|
"""Add a stream log handler.
|
|
27
27
|
|
|
28
28
|
Args:
|
|
@@ -50,12 +50,18 @@ def set_stream_logger(name: str = 'parsl',
|
|
|
50
50
|
futures_logger = logging.getLogger("concurrent.futures")
|
|
51
51
|
futures_logger.addHandler(handler)
|
|
52
52
|
|
|
53
|
+
def unregister_callback():
|
|
54
|
+
logger.removeHandler(handler)
|
|
55
|
+
futures_logger.removeHandler(handler)
|
|
56
|
+
|
|
57
|
+
return unregister_callback
|
|
58
|
+
|
|
53
59
|
|
|
54
60
|
@typeguard.typechecked
|
|
55
61
|
def set_file_logger(filename: str,
|
|
56
62
|
name: str = 'parsl',
|
|
57
63
|
level: int = logging.DEBUG,
|
|
58
|
-
format_string: Optional[str] = None) -> None:
|
|
64
|
+
format_string: Optional[str] = None) -> Callable[[], None]:
|
|
59
65
|
"""Add a file log handler.
|
|
60
66
|
|
|
61
67
|
Args:
|
|
@@ -63,6 +69,12 @@ def set_file_logger(filename: str,
|
|
|
63
69
|
- name (string): Logger name
|
|
64
70
|
- level (logging.LEVEL): Set the logging level.
|
|
65
71
|
- format_string (string): Set the format string
|
|
72
|
+
|
|
73
|
+
Returns:
|
|
74
|
+
- a callable which, when invoked, will reverse the log handler
|
|
75
|
+
attachments made by this call. (compare to how object based pieces
|
|
76
|
+
of parsl model this as a close/shutdown/cleanup method on the
|
|
77
|
+
object))
|
|
66
78
|
"""
|
|
67
79
|
if format_string is None:
|
|
68
80
|
format_string = DEFAULT_FORMAT
|
|
@@ -79,3 +91,9 @@ def set_file_logger(filename: str,
|
|
|
79
91
|
# concurrent.futures
|
|
80
92
|
futures_logger = logging.getLogger("concurrent.futures")
|
|
81
93
|
futures_logger.addHandler(handler)
|
|
94
|
+
|
|
95
|
+
def unregister_callback():
|
|
96
|
+
logger.removeHandler(handler)
|
|
97
|
+
futures_logger.removeHandler(handler)
|
|
98
|
+
|
|
99
|
+
return unregister_callback
|
|
@@ -18,7 +18,7 @@ from parsl.monitoring.types import MonitoringMessage, TaggedMonitoringMessage
|
|
|
18
18
|
from parsl.process_loggers import wrap_with_logs
|
|
19
19
|
from parsl.utils import setproctitle
|
|
20
20
|
|
|
21
|
-
logger = logging.getLogger(
|
|
21
|
+
logger = logging.getLogger(__name__)
|
|
22
22
|
|
|
23
23
|
X = TypeVar('X')
|
|
24
24
|
|
|
@@ -293,11 +293,8 @@ class DatabaseManager:
|
|
|
293
293
|
self.run_dir = run_dir
|
|
294
294
|
os.makedirs(self.run_dir, exist_ok=True)
|
|
295
295
|
|
|
296
|
-
logger.propagate = False
|
|
297
|
-
|
|
298
296
|
set_file_logger(f"{self.run_dir}/database_manager.log", level=logging_level,
|
|
299
|
-
format_string="%(asctime)s.%(msecs)03d %(name)s:%(lineno)d [%(levelname)s] [%(threadName)s %(thread)d] %(message)s"
|
|
300
|
-
name="database_manager")
|
|
297
|
+
format_string="%(asctime)s.%(msecs)03d %(name)s:%(lineno)d [%(levelname)s] [%(threadName)s %(thread)d] %(message)s")
|
|
301
298
|
|
|
302
299
|
logger.debug("Initializing Database Manager process")
|
|
303
300
|
|
|
@@ -550,20 +547,21 @@ class DatabaseManager:
|
|
|
550
547
|
"or some other error. monitoring data may have been lost"
|
|
551
548
|
)
|
|
552
549
|
exception_happened = True
|
|
550
|
+
|
|
551
|
+
if self.external_exit_event.is_set():
|
|
552
|
+
self.close()
|
|
553
|
+
|
|
553
554
|
if exception_happened:
|
|
554
555
|
raise RuntimeError("An exception happened sometime during database processing and should have been logged in database_manager.log")
|
|
555
556
|
|
|
556
|
-
@wrap_with_logs
|
|
557
|
-
def _migrate_logs_to_internal(self, logs_queue:
|
|
557
|
+
@wrap_with_logs
|
|
558
|
+
def _migrate_logs_to_internal(self, logs_queue: mpq.Queue, kill_event: threading.Event) -> None:
|
|
558
559
|
logger.info("Starting _migrate_logs_to_internal")
|
|
559
560
|
|
|
560
561
|
while not kill_event.is_set() or logs_queue.qsize() != 0:
|
|
561
562
|
logger.debug("Checking STOP conditions: kill event: %s, queue has entries: %s",
|
|
562
563
|
kill_event.is_set(), logs_queue.qsize() != 0)
|
|
563
564
|
|
|
564
|
-
if self.external_exit_event.is_set():
|
|
565
|
-
self.close()
|
|
566
|
-
|
|
567
565
|
try:
|
|
568
566
|
x = logs_queue.get(timeout=0.1)
|
|
569
567
|
except queue.Empty:
|
|
@@ -682,7 +680,7 @@ class DatabaseManager:
|
|
|
682
680
|
self._kill_event.set()
|
|
683
681
|
|
|
684
682
|
|
|
685
|
-
@wrap_with_logs
|
|
683
|
+
@wrap_with_logs
|
|
686
684
|
@typeguard.typechecked
|
|
687
685
|
def dbm_starter(resource_msgs: mpq.Queue,
|
|
688
686
|
db_url: str,
|
|
@@ -53,7 +53,7 @@ def test_simple(mem_per_worker):
|
|
|
53
53
|
# Prime a worker
|
|
54
54
|
double(5).result()
|
|
55
55
|
dfk = parsl.dfk()
|
|
56
|
-
connected = dfk.executors['htex_local'].connected_workers
|
|
56
|
+
connected = dfk.executors['htex_local'].connected_workers()
|
|
57
57
|
print("Connected : ", connected)
|
|
58
58
|
assert expected_workers == connected, "Expected {} workers, instead got {} workers".format(expected_workers,
|
|
59
59
|
connected)
|
|
@@ -3,7 +3,7 @@ import argparse
|
|
|
3
3
|
import pytest
|
|
4
4
|
|
|
5
5
|
import parsl
|
|
6
|
-
from parsl.app.app import python_app
|
|
6
|
+
from parsl.app.app import python_app
|
|
7
7
|
from parsl.tests.site_tests.site_config_selector import fresh_config
|
|
8
8
|
|
|
9
9
|
|
|
@@ -35,8 +35,8 @@ def test_platform(n=2, sleep_dur=10):
|
|
|
35
35
|
print([i.result() for i in x])
|
|
36
36
|
|
|
37
37
|
print("Executor : ", dfk.executors[name])
|
|
38
|
-
print("Connected : ", dfk.executors[name].connected_workers)
|
|
39
|
-
print("Outstanding : ", dfk.executors[name].outstanding)
|
|
38
|
+
print("Connected : ", dfk.executors[name].connected_workers())
|
|
39
|
+
print("Outstanding : ", dfk.executors[name].outstanding())
|
|
40
40
|
|
|
41
41
|
d = []
|
|
42
42
|
for i in range(0, n):
|
{parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_scaling/test_regression_3696_oscillation.py
RENAMED
|
@@ -48,7 +48,7 @@ def test_htex_strategy_does_not_oscillate(ns):
|
|
|
48
48
|
statuses = {}
|
|
49
49
|
|
|
50
50
|
executor.provider = provider
|
|
51
|
-
executor.outstanding = n_tasks
|
|
51
|
+
executor.outstanding = lambda: n_tasks
|
|
52
52
|
executor.status_facade = statuses
|
|
53
53
|
executor.workers_per_node = n_workers
|
|
54
54
|
|
|
@@ -97,7 +97,7 @@ def test_htex_strategy_does_not_oscillate(ns):
|
|
|
97
97
|
# this assert fails due to issue #3696
|
|
98
98
|
|
|
99
99
|
# Now check scale in happens with 0 load
|
|
100
|
-
executor.outstanding = 0
|
|
100
|
+
executor.outstanding = lambda: 0
|
|
101
101
|
s.strategize([executor])
|
|
102
102
|
executor.scale_in_facade.assert_called()
|
|
103
103
|
assert len([k for k in statuses if statuses[k].state == JobState.PENDING]) == 0
|
|
@@ -66,7 +66,7 @@ def test_scale_out(tmpd_cwd, try_assert):
|
|
|
66
66
|
num_managers = len(dfk.executors['htex_local'].connected_managers())
|
|
67
67
|
|
|
68
68
|
assert num_managers == 0, "Expected 0 managers at start"
|
|
69
|
-
assert dfk.executors['htex_local'].outstanding == 0, "Expected 0 tasks at start"
|
|
69
|
+
assert dfk.executors['htex_local'].outstanding() == 0, "Expected 0 tasks at start"
|
|
70
70
|
|
|
71
71
|
ntasks = 10
|
|
72
72
|
ready_path = tmpd_cwd / "workers_ready"
|
|
@@ -85,7 +85,7 @@ def test_scale_out(tmpd_cwd, try_assert):
|
|
|
85
85
|
finish_path.touch() # Approximation of Event, via files
|
|
86
86
|
[x.result() for x in futs]
|
|
87
87
|
|
|
88
|
-
assert dfk.executors['htex_local'].outstanding == 0
|
|
88
|
+
assert dfk.executors['htex_local'].outstanding() == 0
|
|
89
89
|
|
|
90
90
|
def assert_kernel():
|
|
91
91
|
return len(dfk.executors['htex_local'].connected_managers()) == _min_blocks
|
{parsl-2025.7.28 → parsl-2025.8.11}/parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py
RENAMED
|
@@ -63,7 +63,7 @@ def test_scale_out(tmpd_cwd, try_assert):
|
|
|
63
63
|
num_managers = len(dfk.executors['htex_local'].connected_managers())
|
|
64
64
|
|
|
65
65
|
assert num_managers == 0, "Expected 0 managers at start"
|
|
66
|
-
assert dfk.executors['htex_local'].outstanding == 0, "Expected 0 tasks at start"
|
|
66
|
+
assert dfk.executors['htex_local'].outstanding() == 0, "Expected 0 tasks at start"
|
|
67
67
|
|
|
68
68
|
ntasks = _max_blocks * 2
|
|
69
69
|
ready_path = tmpd_cwd / "workers_ready"
|
|
@@ -84,7 +84,7 @@ def test_scale_out(tmpd_cwd, try_assert):
|
|
|
84
84
|
finish_path.touch() # Approximation of Event, via files
|
|
85
85
|
[x.result() for x in futs]
|
|
86
86
|
|
|
87
|
-
assert dfk.executors['htex_local'].outstanding == 0
|
|
87
|
+
assert dfk.executors['htex_local'].outstanding() == 0
|
|
88
88
|
|
|
89
89
|
# now we can launch one "long" task -
|
|
90
90
|
# and what should happen is that the connected_managers count "eventually" (?) converges to 1 and stays there.
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import io
|
|
2
|
+
import logging
|
|
3
|
+
|
|
4
|
+
import pytest
|
|
5
|
+
|
|
6
|
+
from parsl.log_utils import set_file_logger, set_stream_logger
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@pytest.mark.local
|
|
10
|
+
def test_stream_close():
|
|
11
|
+
"""Tests that set_stream_logger callback detaches log handler.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger("parsl")
|
|
15
|
+
|
|
16
|
+
s1 = io.StringIO()
|
|
17
|
+
close_callback_1 = set_stream_logger(stream=s1)
|
|
18
|
+
logger.info("AAA")
|
|
19
|
+
close_callback_1()
|
|
20
|
+
|
|
21
|
+
s2 = io.StringIO()
|
|
22
|
+
close_callback_2 = set_stream_logger(stream=s2)
|
|
23
|
+
logger.info("BBB")
|
|
24
|
+
close_callback_2()
|
|
25
|
+
|
|
26
|
+
logger.info("CCC")
|
|
27
|
+
|
|
28
|
+
assert "AAA" in s1.getvalue()
|
|
29
|
+
assert "AAA" not in s2.getvalue()
|
|
30
|
+
|
|
31
|
+
assert "BBB" not in s1.getvalue()
|
|
32
|
+
assert "BBB" in s2.getvalue()
|
|
33
|
+
|
|
34
|
+
assert "CCC" not in s1.getvalue()
|
|
35
|
+
assert "CCC" not in s2.getvalue()
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@pytest.mark.local
|
|
39
|
+
def test_file_close(tmpd_cwd):
|
|
40
|
+
"""Tests that set_file_Logger callback detaches log handler.
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
logger = logging.getLogger("parsl")
|
|
44
|
+
|
|
45
|
+
f1 = str(tmpd_cwd / "log1")
|
|
46
|
+
close_callback_1 = set_file_logger(filename=f1)
|
|
47
|
+
logger.info("AAA")
|
|
48
|
+
close_callback_1()
|
|
49
|
+
|
|
50
|
+
f2 = str(tmpd_cwd / "log2")
|
|
51
|
+
close_callback_2 = set_file_logger(filename=f2)
|
|
52
|
+
logger.info("BBB")
|
|
53
|
+
close_callback_2()
|
|
54
|
+
|
|
55
|
+
logger.info("CCC")
|
|
56
|
+
|
|
57
|
+
with open(f1, "r") as f:
|
|
58
|
+
s1 = f.read()
|
|
59
|
+
|
|
60
|
+
with open(f2, "r") as f:
|
|
61
|
+
s2 = f.read()
|
|
62
|
+
|
|
63
|
+
assert "AAA" in s1
|
|
64
|
+
assert "AAA" not in s2
|
|
65
|
+
|
|
66
|
+
assert "BBB" not in s1
|
|
67
|
+
assert "BBB" in s2
|
|
68
|
+
|
|
69
|
+
assert "CCC" not in s1
|
|
70
|
+
assert "CCC" not in s2
|
|
@@ -9,6 +9,12 @@ class GoodRepr(RepresentationMixin):
|
|
|
9
9
|
self.y = y
|
|
10
10
|
|
|
11
11
|
|
|
12
|
+
class GoodReprDefaults(RepresentationMixin):
|
|
13
|
+
def __init__(self, x, y="default 2"):
|
|
14
|
+
self.x = x
|
|
15
|
+
self.y = y
|
|
16
|
+
|
|
17
|
+
|
|
12
18
|
class BadRepr(RepresentationMixin):
|
|
13
19
|
"""This class incorrectly subclasses RepresentationMixin.
|
|
14
20
|
It does not store the parameter x on self.
|
|
@@ -31,6 +37,33 @@ def test_repr_good():
|
|
|
31
37
|
assert p2 in r
|
|
32
38
|
|
|
33
39
|
|
|
40
|
+
@pytest.mark.local
|
|
41
|
+
def test_repr_good_defaults_overridden():
|
|
42
|
+
p1 = "parameter 1"
|
|
43
|
+
p2 = "the second parameter"
|
|
44
|
+
|
|
45
|
+
# repr should not raise an exception
|
|
46
|
+
r = repr(GoodReprDefaults(p1, p2))
|
|
47
|
+
|
|
48
|
+
# representation should contain both values supplied
|
|
49
|
+
# at object creation.
|
|
50
|
+
assert p1 in r
|
|
51
|
+
assert p2 in r
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
@pytest.mark.local
|
|
55
|
+
def test_repr_good_defaults_defaulted():
|
|
56
|
+
p1 = "parameter 1"
|
|
57
|
+
|
|
58
|
+
# repr should not raise an exception
|
|
59
|
+
r = repr(GoodReprDefaults(p1))
|
|
60
|
+
|
|
61
|
+
# representation should contain one value supplied
|
|
62
|
+
# at object creation, and the other defaulted.
|
|
63
|
+
assert p1 in r
|
|
64
|
+
assert "default 2" in r
|
|
65
|
+
|
|
66
|
+
|
|
34
67
|
@pytest.mark.local
|
|
35
68
|
def test_repr_bad():
|
|
36
69
|
p1 = "parameter 1"
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: parsl
|
|
3
|
-
Version: 2025.
|
|
3
|
+
Version: 2025.8.11
|
|
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.08.11.tar.gz
|
|
7
7
|
Author: The Parsl Team
|
|
8
8
|
Author-email: parsl@googlegroups.com
|
|
9
9
|
License: Apache 2.0
|
|
@@ -267,14 +267,6 @@ parsl/tests/manual_tests/test_log_filter.py
|
|
|
267
267
|
parsl/tests/manual_tests/test_memory_limits.py
|
|
268
268
|
parsl/tests/manual_tests/test_regression_220.py
|
|
269
269
|
parsl/tests/manual_tests/test_worker_count.py
|
|
270
|
-
parsl/tests/scaling_tests/__init__.py
|
|
271
|
-
parsl/tests/scaling_tests/htex_local.py
|
|
272
|
-
parsl/tests/scaling_tests/local_threads.py
|
|
273
|
-
parsl/tests/scaling_tests/test_scale.py
|
|
274
|
-
parsl/tests/scaling_tests/vineex_condor.py
|
|
275
|
-
parsl/tests/scaling_tests/vineex_local.py
|
|
276
|
-
parsl/tests/scaling_tests/wqex_condor.py
|
|
277
|
-
parsl/tests/scaling_tests/wqex_local.py
|
|
278
270
|
parsl/tests/site_tests/__init__.py
|
|
279
271
|
parsl/tests/site_tests/site_config_selector.py
|
|
280
272
|
parsl/tests/site_tests/test_provider.py
|
|
@@ -463,6 +455,7 @@ parsl/tests/test_threads/test_configs.py
|
|
|
463
455
|
parsl/tests/test_threads/test_lazy_errors.py
|
|
464
456
|
parsl/tests/test_utils/__init__.py
|
|
465
457
|
parsl/tests/test_utils/test_execute_wait.py
|
|
458
|
+
parsl/tests/test_utils/test_logutils.py
|
|
466
459
|
parsl/tests/test_utils/test_representation_mixin.py
|
|
467
460
|
parsl/tests/test_utils/test_sanitize_dns.py
|
|
468
461
|
parsl/tests/unit/__init__.py
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
from parsl.config import Config
|
|
2
|
-
from parsl.executors import HighThroughputExecutor
|
|
3
|
-
from parsl.providers import LocalProvider
|
|
4
|
-
|
|
5
|
-
# import os
|
|
6
|
-
config = Config(
|
|
7
|
-
executors=[
|
|
8
|
-
HighThroughputExecutor(
|
|
9
|
-
label="htex_local",
|
|
10
|
-
cores_per_worker=1,
|
|
11
|
-
max_workers_per_node=8,
|
|
12
|
-
encrypted=True,
|
|
13
|
-
provider=LocalProvider(
|
|
14
|
-
init_blocks=1,
|
|
15
|
-
max_blocks=1,
|
|
16
|
-
),
|
|
17
|
-
)
|
|
18
|
-
],
|
|
19
|
-
strategy='none',
|
|
20
|
-
)
|
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
|
|
3
|
-
import argparse
|
|
4
|
-
import time
|
|
5
|
-
|
|
6
|
-
import parsl
|
|
7
|
-
from parsl.app.app import python_app # , bash_app
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
@python_app
|
|
11
|
-
def double(x):
|
|
12
|
-
return x * 2
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
@python_app
|
|
16
|
-
def echo(x, string, stdout=None):
|
|
17
|
-
print(string)
|
|
18
|
-
return x * 5
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
@python_app
|
|
22
|
-
def import_echo(x, string, stdout=None):
|
|
23
|
-
# from time import sleep
|
|
24
|
-
# sleep(0)
|
|
25
|
-
print(string)
|
|
26
|
-
return x * 5
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
@python_app
|
|
30
|
-
def platform(sleep=10, stdout=None):
|
|
31
|
-
import platform
|
|
32
|
-
import time
|
|
33
|
-
time.sleep(sleep)
|
|
34
|
-
return platform.uname()
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
def test_simple(n=2):
|
|
38
|
-
start = time.time()
|
|
39
|
-
x = double(n)
|
|
40
|
-
print("Result : ", x.result())
|
|
41
|
-
assert x.result() == n * \
|
|
42
|
-
2, "Expected double to return:{0} instead got:{1}".format(
|
|
43
|
-
n * 2, x.result())
|
|
44
|
-
print("Duration : {0}s".format(time.time() - start))
|
|
45
|
-
print("[TEST STATUS] test_parallel_for [SUCCESS]")
|
|
46
|
-
return True
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
def test_imports(n=2):
|
|
50
|
-
start = time.time()
|
|
51
|
-
x = import_echo(n, "hello world")
|
|
52
|
-
print("Result : ", x.result())
|
|
53
|
-
assert x.result() == n * \
|
|
54
|
-
5, "Expected double to return:{0} instead got:{1}".format(
|
|
55
|
-
n * 2, x.result())
|
|
56
|
-
print("Duration : {0}s".format(time.time() - start))
|
|
57
|
-
print("[TEST STATUS] test_parallel_for [SUCCESS]")
|
|
58
|
-
return True
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
def test_platform(n=2, sleep=1):
|
|
62
|
-
|
|
63
|
-
dfk = parsl.dfk()
|
|
64
|
-
# sync
|
|
65
|
-
x = platform(sleep=0)
|
|
66
|
-
print(x.result())
|
|
67
|
-
|
|
68
|
-
name = list(dfk.executors.keys())[0]
|
|
69
|
-
print("Trying to get executor : ", name)
|
|
70
|
-
|
|
71
|
-
print("Executor : ", dfk.executors[name])
|
|
72
|
-
print("Connected : ", dfk.executors[name].connected_workers)
|
|
73
|
-
print("Outstanding : ", dfk.executors[name].outstanding)
|
|
74
|
-
d = []
|
|
75
|
-
for i in range(0, n):
|
|
76
|
-
x = platform(sleep=sleep)
|
|
77
|
-
d.append(x)
|
|
78
|
-
|
|
79
|
-
print("Connected : ", dfk.executors[name].connected_workers)
|
|
80
|
-
print("Outstanding : ", dfk.executors[name].outstanding)
|
|
81
|
-
|
|
82
|
-
print(set([i.result()for i in d]))
|
|
83
|
-
|
|
84
|
-
print("Connected : ", dfk.executors[name].connected_workers)
|
|
85
|
-
print("Outstanding : ", dfk.executors[name].outstanding)
|
|
86
|
-
|
|
87
|
-
return True
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
def test_parallel_for(n=2, sleep=1):
|
|
91
|
-
d = {}
|
|
92
|
-
|
|
93
|
-
start = time.time()
|
|
94
|
-
print("Priming ...")
|
|
95
|
-
double(10).result()
|
|
96
|
-
delta = time.time() - start
|
|
97
|
-
print("Priming done in {} seconds".format(delta))
|
|
98
|
-
|
|
99
|
-
start = time.time()
|
|
100
|
-
for i in range(0, n):
|
|
101
|
-
d[i] = platform(sleep=sleep)
|
|
102
|
-
# d[i] = double(i)
|
|
103
|
-
# time.sleep(0.01)
|
|
104
|
-
[d[i].result() for i in d]
|
|
105
|
-
delta = time.time() - start
|
|
106
|
-
print("Time to complete {} tasks: {:8.3f} s".format(n, delta))
|
|
107
|
-
print("Throughput : {:8.3f} Tasks/s".format(n / delta))
|
|
108
|
-
return d
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
if __name__ == '__main__':
|
|
112
|
-
|
|
113
|
-
parser = argparse.ArgumentParser()
|
|
114
|
-
parser.add_argument("-s", "--sleep", default="0")
|
|
115
|
-
parser.add_argument("-c", "--count", default="10",
|
|
116
|
-
help="Count of apps to launch")
|
|
117
|
-
parser.add_argument("-d", "--debug", action='store_true',
|
|
118
|
-
help="Count of apps to launch")
|
|
119
|
-
parser.add_argument("-f", "--fileconfig", required=True)
|
|
120
|
-
|
|
121
|
-
args = parser.parse_args()
|
|
122
|
-
|
|
123
|
-
if args.debug:
|
|
124
|
-
parsl.set_stream_logger()
|
|
125
|
-
|
|
126
|
-
config = None
|
|
127
|
-
exec("from {} import config".format(args.fileconfig))
|
|
128
|
-
parsl.load(config)
|
|
129
|
-
# x = test_simple(int(args.count))
|
|
130
|
-
# x = test_imports()
|
|
131
|
-
x = test_parallel_for(int(args.count), float(args.sleep))
|
|
132
|
-
# x = test_platform(int(args.count), int(args.sleep))
|
|
133
|
-
# x = test_parallel_for(int(args.count))
|
|
134
|
-
# x = test_stdout()
|
|
135
|
-
# x = test_platform()
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
from parsl.config import Config
|
|
2
|
-
from parsl.executors.taskvine import TaskVineExecutor, TaskVineManagerConfig
|
|
3
|
-
from parsl.providers import CondorProvider
|
|
4
|
-
|
|
5
|
-
config = Config(
|
|
6
|
-
executors=[TaskVineExecutor(manager_config=TaskVineManagerConfig(port=50055),
|
|
7
|
-
provider=CondorProvider(),
|
|
8
|
-
)]
|
|
9
|
-
)
|