parsl 2025.9.8__tar.gz → 2025.9.15__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.8/parsl.egg-info → parsl-2025.9.15}/PKG-INFO +2 -2
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/curvezmq.py +0 -16
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/high_throughput/executor.py +8 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/high_throughput/interchange.py +10 -1
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/high_throughput/zmq_pipes.py +29 -43
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/monitoring.py +2 -2
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/multiprocessing.py +0 -49
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_curvezmq.py +0 -42
- parsl-2025.9.15/parsl/tests/test_htex/test_command_concurrency_regression_1321.py +54 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_interchange_exit_bad_registration.py +2 -1
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_priority_queue.py +1 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_zmq_binding.py +2 -1
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/version.py +1 -1
- {parsl-2025.9.8 → parsl-2025.9.15/parsl.egg-info}/PKG-INFO +2 -2
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl.egg-info/SOURCES.txt +1 -6
- parsl-2025.9.8/parsl/tests/site_tests/test_provider.py +0 -88
- parsl-2025.9.8/parsl/tests/site_tests/test_site.py +0 -70
- parsl-2025.9.8/parsl/tests/test_aalst_patterns.py +0 -474
- parsl-2025.9.8/parsl/tests/test_docs/test_workflow2.py +0 -42
- parsl-2025.9.8/parsl/tests/test_error_handling/test_rand_fail.py +0 -171
- parsl-2025.9.8/parsl/tests/test_regression/test_854.py +0 -62
- {parsl-2025.9.8 → parsl-2025.9.15}/LICENSE +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/MANIFEST.in +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/README.rst +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/addresses.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/app/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/app/app.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/app/bash.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/app/errors.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/app/futures.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/app/python.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/benchmark/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/benchmark/perf.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/concurrent/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/config.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/ASPIRE1.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/Azure.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/anvil.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/bridges.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/cc_in2p3.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/delta.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/ec2.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/expanse.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/frontera.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/gc_multisite.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/gc_tutorial.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/htex_local.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/illinoiscluster.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/improv.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/kubernetes.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/local_threads.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/midway.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/osg.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/polaris.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/stampede2.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/summit.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/toss3_llnl.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/vineex_local.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/wqex_local.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/data_provider/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/data_provider/data_manager.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/data_provider/file_noop.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/data_provider/files.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/data_provider/ftp.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/data_provider/globus.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/data_provider/http.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/data_provider/rsync.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/data_provider/staging.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/data_provider/zip.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/dataflow/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/dataflow/dependency_resolvers.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/dataflow/dflow.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/dataflow/errors.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/dataflow/futures.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/dataflow/memoization.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/dataflow/rundirs.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/dataflow/states.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/dataflow/taskrecord.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/errors.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/base.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/errors.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/execute_task.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/flux/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/flux/execute_parsl_task.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/flux/executor.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/flux/flux_instance_manager.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/globus_compute.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/high_throughput/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/high_throughput/errors.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/high_throughput/manager_record.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/high_throughput/manager_selector.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/high_throughput/monitoring_info.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/high_throughput/mpi_executor.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/high_throughput/mpi_prefix_composer.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/high_throughput/mpi_resource_management.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/high_throughput/probe.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/high_throughput/process_worker_pool.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/radical/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/radical/executor.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/radical/rpex_resources.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/radical/rpex_worker.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/status_handling.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/taskvine/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/taskvine/errors.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/taskvine/exec_parsl_function.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/taskvine/executor.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/taskvine/factory.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/taskvine/factory_config.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/taskvine/manager.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/taskvine/manager_config.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/taskvine/utils.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/threads.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/workqueue/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/workqueue/errors.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/workqueue/exec_parsl_function.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/workqueue/executor.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/workqueue/parsl_coprocess.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/jobs/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/jobs/error_handlers.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/jobs/errors.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/jobs/job_status_poller.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/jobs/states.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/jobs/strategy.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/launchers/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/launchers/base.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/launchers/errors.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/launchers/launchers.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/log_utils.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/db_manager.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/errors.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/message_type.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/queries/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/queries/pandas.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/radios/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/radios/base.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/radios/filesystem.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/radios/filesystem_router.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/radios/htex.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/radios/multiprocessing.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/radios/udp.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/radios/udp_router.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/radios/zmq.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/radios/zmq_router.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/remote.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/types.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/app.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/models.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/plots/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/plots/default/workflow_plots.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/templates/app.html +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/templates/dag.html +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/templates/error.html +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/templates/layout.html +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/templates/task.html +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/templates/workflow.html +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/utils.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/version.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/views.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/process_loggers.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/aws/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/aws/aws.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/aws/template.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/azure/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/azure/azure.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/azure/template.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/base.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/cluster_provider.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/condor/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/condor/condor.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/condor/template.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/errors.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/googlecloud/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/googlecloud/googlecloud.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/grid_engine/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/grid_engine/grid_engine.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/grid_engine/template.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/kubernetes/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/kubernetes/kube.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/kubernetes/template.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/local/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/local/local.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/lsf/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/lsf/lsf.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/lsf/template.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/pbspro/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/pbspro/pbspro.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/pbspro/template.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/slurm/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/slurm/slurm.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/slurm/template.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/torque/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/torque/template.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/torque/torque.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/py.typed +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/serialize/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/serialize/base.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/serialize/concretes.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/serialize/errors.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/serialize/facade.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/serialize/proxystore.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/callables_helper.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/azure_single_node.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/bluewaters.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/bridges.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/cc_in2p3.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/comet.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/ec2_single_node.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/ec2_spot.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/flux_local.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/frontera.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/globus_compute.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/htex_local.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/htex_local_alternate.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/htex_local_intask_staging.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/htex_local_rsync_staging.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/local_radical.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/local_radical_mpi.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/local_threads.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/local_threads_checkpoint_periodic.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/local_threads_globus.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/local_threads_no_cache.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/midway.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/nscc_singapore.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/osg_htex.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/petrelkube.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/slurm_local.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/summit.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/taskvine_ex.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/user_opts.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/workqueue_ex.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/conftest.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/integration/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/integration/latency.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/integration/test_apps/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/integration/test_stress/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/manual_tests/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/manual_tests/htex_local.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/manual_tests/test_basic.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/manual_tests/test_log_filter.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/manual_tests/test_memory_limits.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/manual_tests/test_regression_220.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/manual_tests/test_worker_count.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/site_tests/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/site_tests/site_config_selector.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/sites/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/sites/test_affinity.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/sites/test_concurrent.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/sites/test_dynamic_executor.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/sites/test_ec2.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/sites/test_launchers.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/sites/test_mpi/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/sites/test_worker_info.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_bash_apps/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_basic.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_inputs_default.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_memoize.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_multiline.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_pipeline.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_std_uri.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_stdout.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_callables.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_checkpointing/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_checkpointing/test_periodic.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_checkpointing/test_regression_233.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_checkpointing/test_task_exit.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_docs/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_docs/test_from_slides.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_docs/test_kwargs.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_docs/test_workflow1.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_docs/test_workflow4.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_error_handling/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_error_handling/test_fail.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_error_handling/test_python_walltime.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_error_handling/test_resource_spec.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_error_handling/test_retries.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_execute_task.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_flowcontrol/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_flux.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_basic.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_block_manager_selector_unit.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_command_client_timeout.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_connected_blocks.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_cpu_affinity_explicit.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_disconnected_blocks.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_disconnected_blocks_failing_provider.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_drain.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_htex.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_manager_failure.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_manager_selector_by_block.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_managers_command.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_missing_worker.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_multiple_disconnected_blocks.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_resource_spec_validation.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_worker_failure.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_monitoring/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_app_names.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_basic.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_exit_helper.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_htex_fuzz_zmq.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_incomplete_futures.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_memoization_representation.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_radio_filesystem.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_radio_multiprocessing.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_radio_udp.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_radio_zmq.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_stdouterr.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_mpi_apps/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_mpi_apps/test_bad_mpi_config.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_mpi_apps/test_mpi_prefix.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_mpi_apps/test_mpi_scheduler.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_mpi_apps/test_mpiex.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_mpi_apps/test_resource_spec.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_providers/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_providers/test_kubernetes_provider.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_providers/test_local_provider.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_providers/test_pbspro_template.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_providers/test_slurm_instantiate.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_providers/test_slurm_template.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_providers/test_submiterror_deprecation.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_basic.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_context_manager.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_dep_standard_futures.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_dependencies_deep.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_depfail_propagation.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_fail.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_futures.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_garbage_collect.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_inputs_default.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_join.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_lifted.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_mapred.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_memoize_2.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_memoize_exception.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_outputs.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_overview.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_pipeline.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_pluggable_future_resolution.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_simple.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_timeout.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_type5.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_radical/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_radical/test_mpi_funcs.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_regression/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_regression/test_1480.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_regression/test_1653.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_regression/test_221.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_regression/test_226.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_regression/test_2652.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_regression/test_69a.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_regression/test_97_parallelism_0.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_regression/test_98.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_scaling/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_scaling/test_block_error_handler.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_scaling/test_regression_1621.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_scaling/test_regression_3568_scaledown_vs_MISSING.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_scaling/test_regression_3696_oscillation.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_scaling/test_scale_down.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_scaling/test_shutdown_scalein.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_scaling/test_worker_interchange_bad_messages_3262.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_serialization/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_serialization/test_2555_caching_deserializer.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_serialization/test_3495_deserialize_managerlost.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_serialization/test_basic.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_serialization/test_htex_code_cache.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_serialization/test_pack_resource_spec.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_serialization/test_proxystore_configured.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_serialization/test_proxystore_impl.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_shutdown/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_shutdown/test_kill_monitoring.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_staging/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_staging/staging_provider.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_staging/test_1316.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_staging/test_docs_1.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_staging/test_docs_2.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_staging/test_file.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_staging/test_file_apps.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_staging/test_file_staging.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_staging/test_output_chain_filenames.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_staging/test_staging_globus.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_staging/test_staging_https.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_staging/test_staging_stdout.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_staging/test_zip_in.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_staging/test_zip_out.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_staging/test_zip_to_zip.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_summary.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_thread_parallelism.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_threads/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_threads/test_configs.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_utils/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_utils/test_execute_wait.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_utils/test_logutils.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_utils/test_representation_mixin.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_utils/test_sanitize_dns.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/unit/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/unit/test_address.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/unit/test_file.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/unit/test_globus_compute_executor.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/unit/test_usage_tracking.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/utils.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/usage_tracking/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/usage_tracking/api.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/usage_tracking/levels.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/usage_tracking/usage.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl/utils.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl.egg-info/dependency_links.txt +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl.egg-info/entry_points.txt +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl.egg-info/requires.txt +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/parsl.egg-info/top_level.txt +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/requirements.txt +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/setup.cfg +0 -0
- {parsl-2025.9.8 → parsl-2025.9.15}/setup.py +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: parsl
|
|
3
|
-
Version: 2025.9.
|
|
3
|
+
Version: 2025.9.15
|
|
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.09.
|
|
6
|
+
Download-URL: https://github.com/Parsl/parsl/archive/2025.09.15.tar.gz
|
|
7
7
|
Author: The Parsl Team
|
|
8
8
|
Author-email: parsl@googlegroups.com
|
|
9
9
|
License: Apache 2.0
|
|
@@ -101,17 +101,6 @@ class BaseContext(metaclass=ABCMeta):
|
|
|
101
101
|
"""
|
|
102
102
|
self._ctx.destroy(linger)
|
|
103
103
|
|
|
104
|
-
def recreate(self, linger: Optional[int] = None):
|
|
105
|
-
"""Destroy then recreate the context.
|
|
106
|
-
|
|
107
|
-
Parameters
|
|
108
|
-
----------
|
|
109
|
-
linger : int, optional
|
|
110
|
-
If specified, set LINGER on sockets prior to closing them.
|
|
111
|
-
"""
|
|
112
|
-
self.destroy(linger)
|
|
113
|
-
self._ctx = zmq.Context()
|
|
114
|
-
|
|
115
104
|
|
|
116
105
|
class ServerContext(BaseContext):
|
|
117
106
|
"""CurveZMQ server context
|
|
@@ -175,11 +164,6 @@ class ServerContext(BaseContext):
|
|
|
175
164
|
self.auth_thread.stop()
|
|
176
165
|
super().destroy(linger)
|
|
177
166
|
|
|
178
|
-
def recreate(self, linger: Optional[int] = None):
|
|
179
|
-
super().recreate(linger)
|
|
180
|
-
if self.auth_thread:
|
|
181
|
-
self.auth_thread = self._start_auth_thread()
|
|
182
|
-
|
|
183
167
|
|
|
184
168
|
class ClientContext(BaseContext):
|
|
185
169
|
"""CurveZMQ client context
|
|
@@ -332,6 +332,13 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
|
|
|
332
332
|
self.encrypted = encrypted
|
|
333
333
|
self.cert_dir = None
|
|
334
334
|
|
|
335
|
+
# This flag will enable/disable internal Python mismatch checks
|
|
336
|
+
# between the interchange and worker managers. This serves as a
|
|
337
|
+
# temporary workaround for Globus Compute to support different
|
|
338
|
+
# Python versions at the endpoint and worker layers. We can drop
|
|
339
|
+
# the flag once we implement modular internal message protocols.
|
|
340
|
+
self._check_python_mismatch: bool = True
|
|
341
|
+
|
|
335
342
|
if not launch_cmd:
|
|
336
343
|
launch_cmd = DEFAULT_LAUNCH_CMD
|
|
337
344
|
self.launch_cmd = launch_cmd
|
|
@@ -568,6 +575,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
|
|
|
568
575
|
"cert_dir": self.cert_dir,
|
|
569
576
|
"manager_selector": self.manager_selector,
|
|
570
577
|
"run_id": self.run_id,
|
|
578
|
+
"_check_python_mismatch": self._check_python_mismatch,
|
|
571
579
|
}
|
|
572
580
|
|
|
573
581
|
config_pickle = pickle.dumps(interchange_config)
|
|
@@ -56,6 +56,7 @@ class Interchange:
|
|
|
56
56
|
cert_dir: Optional[str],
|
|
57
57
|
manager_selector: ManagerSelector,
|
|
58
58
|
run_id: str,
|
|
59
|
+
_check_python_mismatch: bool,
|
|
59
60
|
) -> None:
|
|
60
61
|
"""
|
|
61
62
|
Parameters
|
|
@@ -99,6 +100,11 @@ class Interchange:
|
|
|
99
100
|
|
|
100
101
|
cert_dir : str | None
|
|
101
102
|
Path to the certificate directory.
|
|
103
|
+
|
|
104
|
+
_check_python_mismatch : bool
|
|
105
|
+
If True, the interchange and worker managers must run the same version of
|
|
106
|
+
Python. Running different versions can cause inter-process communication
|
|
107
|
+
errors, so proceed with caution.
|
|
102
108
|
"""
|
|
103
109
|
self.cert_dir = cert_dir
|
|
104
110
|
self.logdir = logdir
|
|
@@ -126,6 +132,7 @@ class Interchange:
|
|
|
126
132
|
logger.info("Connected to client")
|
|
127
133
|
|
|
128
134
|
self.run_id = run_id
|
|
135
|
+
self._check_python_mismatch = _check_python_mismatch
|
|
129
136
|
|
|
130
137
|
self.hub_address = hub_address
|
|
131
138
|
self.hub_zmq_port = hub_zmq_port
|
|
@@ -396,7 +403,9 @@ class Interchange:
|
|
|
396
403
|
logger.info(f'Registration info for manager {manager_id!r}: {meta}')
|
|
397
404
|
self._send_monitoring_info(monitoring_radio, new_rec)
|
|
398
405
|
|
|
399
|
-
|
|
406
|
+
python_mismatch: bool = ix_minor_py != mgr_minor_py
|
|
407
|
+
parsl_mismatch: bool = ix_parsl_v != mgr_parsl_v
|
|
408
|
+
if parsl_mismatch or (self._check_python_mismatch and python_mismatch):
|
|
400
409
|
kill_event.set()
|
|
401
410
|
vm_exc = VersionMismatch(
|
|
402
411
|
f"py.v={ix_minor_py} parsl.v={ix_parsl_v}",
|
|
@@ -74,51 +74,37 @@ class CommandClient:
|
|
|
74
74
|
|
|
75
75
|
reply = '__PARSL_ZMQ_PIPES_MAGIC__'
|
|
76
76
|
with self._lock:
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
elif poll_result == 0:
|
|
87
|
-
raise CommandClientTimeoutError("Waiting for command channel to be ready for a command")
|
|
88
|
-
else:
|
|
89
|
-
raise InternalConsistencyError(f"ZMQ poll returned unexpected value: {poll_result}")
|
|
90
|
-
|
|
91
|
-
self.zmq_socket.send_pyobj(message, copy=True)
|
|
92
|
-
|
|
93
|
-
if timeout_s is not None:
|
|
94
|
-
logger.debug("Polling for command client response or timeout")
|
|
95
|
-
remaining_time_s = start_time_s + timeout_s - time.monotonic()
|
|
96
|
-
poll_result = self.zmq_socket.poll(timeout=remaining_time_s * 1000, flags=zmq.POLLIN)
|
|
97
|
-
if poll_result == zmq.POLLIN:
|
|
98
|
-
pass # this is OK, so continue
|
|
99
|
-
elif poll_result == 0:
|
|
100
|
-
logger.error("Command timed-out - command client is now bad forever")
|
|
101
|
-
self.ok = False
|
|
102
|
-
raise CommandClientTimeoutError("Waiting for a reply from command channel")
|
|
103
|
-
else:
|
|
104
|
-
raise InternalConsistencyError(f"ZMQ poll returned unexpected value: {poll_result}")
|
|
105
|
-
|
|
106
|
-
logger.debug("Receiving command client response")
|
|
107
|
-
reply = self.zmq_socket.recv_pyobj()
|
|
108
|
-
logger.debug("Received command client response")
|
|
109
|
-
except zmq.ZMQError:
|
|
110
|
-
logger.exception("Potential ZMQ REQ-REP deadlock caught")
|
|
111
|
-
logger.info("Trying to reestablish context")
|
|
112
|
-
self.zmq_context.recreate()
|
|
113
|
-
self.create_socket_and_bind()
|
|
77
|
+
logger.debug("Sending command client command")
|
|
78
|
+
|
|
79
|
+
if timeout_s is not None:
|
|
80
|
+
remaining_time_s = start_time_s + timeout_s - time.monotonic()
|
|
81
|
+
poll_result = self.zmq_socket.poll(timeout=remaining_time_s * 1000, flags=zmq.POLLOUT)
|
|
82
|
+
if poll_result == zmq.POLLOUT:
|
|
83
|
+
pass # this is OK, so continue
|
|
84
|
+
elif poll_result == 0:
|
|
85
|
+
raise CommandClientTimeoutError("Waiting for command channel to be ready for a command")
|
|
114
86
|
else:
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
87
|
+
raise InternalConsistencyError(f"ZMQ poll returned unexpected value: {poll_result}")
|
|
88
|
+
|
|
89
|
+
self.zmq_socket.send_pyobj(message, copy=True)
|
|
90
|
+
|
|
91
|
+
if timeout_s is not None:
|
|
92
|
+
logger.debug("Polling for command client response or timeout")
|
|
93
|
+
remaining_time_s = start_time_s + timeout_s - time.monotonic()
|
|
94
|
+
poll_result = self.zmq_socket.poll(timeout=remaining_time_s * 1000, flags=zmq.POLLIN)
|
|
95
|
+
if poll_result == zmq.POLLIN:
|
|
96
|
+
pass # this is OK, so continue
|
|
97
|
+
elif poll_result == 0:
|
|
98
|
+
logger.error("Command timed-out - command client is now bad forever")
|
|
99
|
+
self.ok = False
|
|
100
|
+
raise CommandClientTimeoutError("Waiting for a reply from command channel")
|
|
101
|
+
else:
|
|
102
|
+
raise InternalConsistencyError(f"ZMQ poll returned unexpected value: {poll_result}")
|
|
120
103
|
|
|
121
|
-
|
|
104
|
+
logger.debug("Receiving command client response")
|
|
105
|
+
reply = self.zmq_socket.recv_pyobj()
|
|
106
|
+
logger.debug("Received command client response")
|
|
107
|
+
return reply
|
|
122
108
|
|
|
123
109
|
def close(self):
|
|
124
110
|
self.zmq_socket.close()
|
|
@@ -11,9 +11,9 @@ import typeguard
|
|
|
11
11
|
|
|
12
12
|
from parsl.monitoring.types import TaggedMonitoringMessage
|
|
13
13
|
from parsl.multiprocessing import (
|
|
14
|
-
SizedQueue,
|
|
15
14
|
SpawnEvent,
|
|
16
15
|
SpawnProcess,
|
|
16
|
+
SpawnQueue,
|
|
17
17
|
join_terminate_close_proc,
|
|
18
18
|
)
|
|
19
19
|
from parsl.utils import RepresentationMixin
|
|
@@ -126,7 +126,7 @@ class MonitoringHub(RepresentationMixin):
|
|
|
126
126
|
self.monitoring_hub_active = True
|
|
127
127
|
|
|
128
128
|
self.resource_msgs: Queue[TaggedMonitoringMessage]
|
|
129
|
-
self.resource_msgs =
|
|
129
|
+
self.resource_msgs = SpawnQueue()
|
|
130
130
|
|
|
131
131
|
self.dbm_exit_event: ms.Event
|
|
132
132
|
self.dbm_exit_event = SpawnEvent()
|
|
@@ -4,7 +4,6 @@
|
|
|
4
4
|
import logging
|
|
5
5
|
import multiprocessing
|
|
6
6
|
import multiprocessing.queues
|
|
7
|
-
import platform
|
|
8
7
|
from multiprocessing.context import ForkProcess as ForkProcessType
|
|
9
8
|
from multiprocessing.context import SpawnProcess as SpawnProcessType
|
|
10
9
|
from typing import Callable
|
|
@@ -21,54 +20,6 @@ SpawnEvent = SpawnContext.Event
|
|
|
21
20
|
SpawnQueue = SpawnContext.Queue
|
|
22
21
|
|
|
23
22
|
|
|
24
|
-
class MacSafeQueue(multiprocessing.queues.Queue):
|
|
25
|
-
""" Multiprocessing queues do not have qsize attributes on MacOS.
|
|
26
|
-
This is slower but more portable version of the multiprocessing Queue
|
|
27
|
-
that adds a explicit counter
|
|
28
|
-
|
|
29
|
-
Reference : https://github.com/keras-team/autokeras/commit/4ddd568b06b4045ace777bc0fb7bc18573b85a75
|
|
30
|
-
"""
|
|
31
|
-
|
|
32
|
-
def __init__(self, *args, **kwargs):
|
|
33
|
-
if 'ctx' not in kwargs:
|
|
34
|
-
kwargs['ctx'] = multiprocessing.get_context('spawn')
|
|
35
|
-
super().__init__(*args, **kwargs)
|
|
36
|
-
self._counter = multiprocessing.Value('i', 0)
|
|
37
|
-
|
|
38
|
-
def put(self, *args, **kwargs):
|
|
39
|
-
# logger.critical("Putting item {}".format(args))
|
|
40
|
-
x = super().put(*args, **kwargs)
|
|
41
|
-
with self._counter.get_lock():
|
|
42
|
-
self._counter.value += 1
|
|
43
|
-
return x
|
|
44
|
-
|
|
45
|
-
def get(self, *args, **kwargs):
|
|
46
|
-
x = super().get(*args, **kwargs)
|
|
47
|
-
with self._counter.get_lock():
|
|
48
|
-
self._counter.value -= 1
|
|
49
|
-
# logger.critical("Getting item {}".format(x))
|
|
50
|
-
return x
|
|
51
|
-
|
|
52
|
-
def qsize(self):
|
|
53
|
-
return self._counter.value
|
|
54
|
-
|
|
55
|
-
def empty(self):
|
|
56
|
-
return not self._counter.value
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
# SizedQueue should be constructable using the same calling
|
|
60
|
-
# convention as multiprocessing.Queue but that entire signature
|
|
61
|
-
# isn't expressible in mypy 0.790
|
|
62
|
-
SizedQueue: Callable[..., multiprocessing.Queue]
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
if platform.system() != 'Darwin':
|
|
66
|
-
import multiprocessing
|
|
67
|
-
SizedQueue = SpawnQueue
|
|
68
|
-
else:
|
|
69
|
-
SizedQueue = MacSafeQueue
|
|
70
|
-
|
|
71
|
-
|
|
72
23
|
def join_terminate_close_proc(process: SpawnProcessType, *, timeout: int = 30) -> None:
|
|
73
24
|
"""Increasingly aggressively terminate a process.
|
|
74
25
|
|
|
@@ -296,48 +296,6 @@ def test_server_context_destroy(server_ctx: curvezmq.ServerContext, encrypted: b
|
|
|
296
296
|
assert not server_ctx.auth_thread.pipe
|
|
297
297
|
|
|
298
298
|
|
|
299
|
-
@pytest.mark.local
|
|
300
|
-
@pytest.mark.parametrize("encrypted", (True, False), indirect=True)
|
|
301
|
-
def test_client_context_recreate(client_ctx: curvezmq.ClientContext):
|
|
302
|
-
hidden_ctx = client_ctx._ctx
|
|
303
|
-
sock = client_ctx.socket(zmq.REQ)
|
|
304
|
-
|
|
305
|
-
assert not sock.closed
|
|
306
|
-
assert not client_ctx.closed
|
|
307
|
-
|
|
308
|
-
client_ctx.recreate()
|
|
309
|
-
|
|
310
|
-
assert sock.closed
|
|
311
|
-
assert not client_ctx.closed
|
|
312
|
-
assert hidden_ctx != client_ctx._ctx
|
|
313
|
-
assert hidden_ctx.closed
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
@pytest.mark.local
|
|
317
|
-
@pytest.mark.parametrize("encrypted", (True, False), indirect=True)
|
|
318
|
-
def test_server_context_recreate(server_ctx: curvezmq.ServerContext, encrypted: bool):
|
|
319
|
-
hidden_ctx = server_ctx._ctx
|
|
320
|
-
sock = server_ctx.socket(zmq.REP)
|
|
321
|
-
|
|
322
|
-
assert not sock.closed
|
|
323
|
-
assert not server_ctx.closed
|
|
324
|
-
if encrypted:
|
|
325
|
-
assert server_ctx.auth_thread
|
|
326
|
-
auth_thread = server_ctx.auth_thread
|
|
327
|
-
assert auth_thread.pipe
|
|
328
|
-
|
|
329
|
-
server_ctx.recreate()
|
|
330
|
-
|
|
331
|
-
assert sock.closed
|
|
332
|
-
assert not server_ctx.closed
|
|
333
|
-
assert hidden_ctx.closed
|
|
334
|
-
assert hidden_ctx != server_ctx._ctx
|
|
335
|
-
if encrypted:
|
|
336
|
-
assert server_ctx.auth_thread
|
|
337
|
-
assert auth_thread != server_ctx.auth_thread
|
|
338
|
-
assert server_ctx.auth_thread.pipe
|
|
339
|
-
|
|
340
|
-
|
|
341
299
|
@pytest.mark.local
|
|
342
300
|
@pytest.mark.parametrize("encrypted", (True, False), indirect=True)
|
|
343
301
|
def test_connection(
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import time
|
|
2
|
+
from threading import Event, Thread
|
|
3
|
+
|
|
4
|
+
import pytest
|
|
5
|
+
|
|
6
|
+
import parsl
|
|
7
|
+
from parsl.tests.configs.htex_local import fresh_config as local_config
|
|
8
|
+
|
|
9
|
+
N_THREADS = 50
|
|
10
|
+
DURATION_S = 10
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@pytest.mark.local
|
|
14
|
+
def test_concurrency_blast():
|
|
15
|
+
"""Blast interchange command channel from many threads.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
cc = parsl.dfk().executors['htex_local'].command_client
|
|
19
|
+
|
|
20
|
+
threads = []
|
|
21
|
+
|
|
22
|
+
ok_so_far = True
|
|
23
|
+
|
|
24
|
+
for _ in range(N_THREADS):
|
|
25
|
+
|
|
26
|
+
# This event will be set if the thread reaches the end of its body.
|
|
27
|
+
event = Event()
|
|
28
|
+
|
|
29
|
+
thread = Thread(target=blast, args=(cc, event))
|
|
30
|
+
threads.append((thread, event))
|
|
31
|
+
|
|
32
|
+
for thread, event in threads:
|
|
33
|
+
thread.start()
|
|
34
|
+
|
|
35
|
+
for thread, event in threads:
|
|
36
|
+
thread.join()
|
|
37
|
+
if not event.is_set():
|
|
38
|
+
ok_so_far = False
|
|
39
|
+
|
|
40
|
+
assert ok_so_far, "at least one thread did not exit normally"
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def blast(cc, e):
|
|
44
|
+
target_end = time.monotonic() + DURATION_S
|
|
45
|
+
|
|
46
|
+
while time.monotonic() < target_end:
|
|
47
|
+
cc.run("WORKERS")
|
|
48
|
+
cc.run("MANGERs_PACKAGES")
|
|
49
|
+
cc.run("CONNECTED_BLOCKS")
|
|
50
|
+
cc.run("WORKER_BINDS")
|
|
51
|
+
|
|
52
|
+
# If any of the preceeding cc.run calls raises an exception, the thread
|
|
53
|
+
# will not set its successful completion event.
|
|
54
|
+
e.set()
|
{parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_interchange_exit_bad_registration.py
RENAMED
|
@@ -50,7 +50,8 @@ def test_exit_with_bad_registration(tmpd_cwd, try_assert):
|
|
|
50
50
|
"logging_level": logging.DEBUG,
|
|
51
51
|
"cert_dir": None,
|
|
52
52
|
"manager_selector": RandomManagerSelector(),
|
|
53
|
-
"run_id": "test"
|
|
53
|
+
"run_id": "test",
|
|
54
|
+
"_check_python_mismatch": True,
|
|
54
55
|
}
|
|
55
56
|
|
|
56
57
|
config_pickle = pickle.dumps(interchange_config)
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: parsl
|
|
3
|
-
Version: 2025.9.
|
|
3
|
+
Version: 2025.9.15
|
|
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.09.
|
|
6
|
+
Download-URL: https://github.com/Parsl/parsl/archive/2025.09.15.tar.gz
|
|
7
7
|
Author: The Parsl Team
|
|
8
8
|
Author-email: parsl@googlegroups.com
|
|
9
9
|
License: Apache 2.0
|
|
@@ -210,7 +210,6 @@ parsl/serialize/proxystore.py
|
|
|
210
210
|
parsl/tests/__init__.py
|
|
211
211
|
parsl/tests/callables_helper.py
|
|
212
212
|
parsl/tests/conftest.py
|
|
213
|
-
parsl/tests/test_aalst_patterns.py
|
|
214
213
|
parsl/tests/test_callables.py
|
|
215
214
|
parsl/tests/test_curvezmq.py
|
|
216
215
|
parsl/tests/test_execute_task.py
|
|
@@ -269,8 +268,6 @@ parsl/tests/manual_tests/test_regression_220.py
|
|
|
269
268
|
parsl/tests/manual_tests/test_worker_count.py
|
|
270
269
|
parsl/tests/site_tests/__init__.py
|
|
271
270
|
parsl/tests/site_tests/site_config_selector.py
|
|
272
|
-
parsl/tests/site_tests/test_provider.py
|
|
273
|
-
parsl/tests/site_tests/test_site.py
|
|
274
271
|
parsl/tests/sites/__init__.py
|
|
275
272
|
parsl/tests/sites/test_affinity.py
|
|
276
273
|
parsl/tests/sites/test_concurrent.py
|
|
@@ -306,12 +303,10 @@ parsl/tests/test_docs/test_from_slides.py
|
|
|
306
303
|
parsl/tests/test_docs/test_kwargs.py
|
|
307
304
|
parsl/tests/test_docs/test_tutorial_1.py
|
|
308
305
|
parsl/tests/test_docs/test_workflow1.py
|
|
309
|
-
parsl/tests/test_docs/test_workflow2.py
|
|
310
306
|
parsl/tests/test_docs/test_workflow4.py
|
|
311
307
|
parsl/tests/test_error_handling/__init__.py
|
|
312
308
|
parsl/tests/test_error_handling/test_fail.py
|
|
313
309
|
parsl/tests/test_error_handling/test_python_walltime.py
|
|
314
|
-
parsl/tests/test_error_handling/test_rand_fail.py
|
|
315
310
|
parsl/tests/test_error_handling/test_resource_spec.py
|
|
316
311
|
parsl/tests/test_error_handling/test_retries.py
|
|
317
312
|
parsl/tests/test_error_handling/test_retry_handler.py
|
|
@@ -323,6 +318,7 @@ parsl/tests/test_htex/__init__.py
|
|
|
323
318
|
parsl/tests/test_htex/test_basic.py
|
|
324
319
|
parsl/tests/test_htex/test_block_manager_selector_unit.py
|
|
325
320
|
parsl/tests/test_htex/test_command_client_timeout.py
|
|
321
|
+
parsl/tests/test_htex/test_command_concurrency_regression_1321.py
|
|
326
322
|
parsl/tests/test_htex/test_connected_blocks.py
|
|
327
323
|
parsl/tests/test_htex/test_cpu_affinity_explicit.py
|
|
328
324
|
parsl/tests/test_htex/test_disconnected_blocks.py
|
|
@@ -410,7 +406,6 @@ parsl/tests/test_regression/test_221.py
|
|
|
410
406
|
parsl/tests/test_regression/test_226.py
|
|
411
407
|
parsl/tests/test_regression/test_2652.py
|
|
412
408
|
parsl/tests/test_regression/test_69a.py
|
|
413
|
-
parsl/tests/test_regression/test_854.py
|
|
414
409
|
parsl/tests/test_regression/test_97_parallelism_0.py
|
|
415
410
|
parsl/tests/test_regression/test_98.py
|
|
416
411
|
parsl/tests/test_scaling/__init__.py
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
import argparse
|
|
2
|
-
import logging
|
|
3
|
-
import time
|
|
4
|
-
|
|
5
|
-
import pytest
|
|
6
|
-
|
|
7
|
-
import parsl
|
|
8
|
-
from parsl.app.app import python_app # , bash_app
|
|
9
|
-
from parsl.jobs.states import JobState
|
|
10
|
-
from parsl.tests.site_tests.site_config_selector import fresh_config
|
|
11
|
-
|
|
12
|
-
logger = logging.getLogger(__name__)
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
@python_app
|
|
16
|
-
def platform(sleep=10, stdout=None):
|
|
17
|
-
import time
|
|
18
|
-
time.sleep(sleep)
|
|
19
|
-
return True
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
@pytest.mark.local
|
|
23
|
-
@pytest.mark.skip("This test cannot run on sites which cannot be identified by site_config_selector")
|
|
24
|
-
def test_provider():
|
|
25
|
-
""" Provider scaling
|
|
26
|
-
"""
|
|
27
|
-
logger.info("Starting test_provider")
|
|
28
|
-
config = fresh_config()
|
|
29
|
-
name = config.executors[0].label
|
|
30
|
-
parsl.load(config)
|
|
31
|
-
|
|
32
|
-
dfk = parsl.dfk()
|
|
33
|
-
logger.info("Trying to get executor : {}".format(name))
|
|
34
|
-
|
|
35
|
-
x = platform(sleep=0)
|
|
36
|
-
logger.info("Result is {}".format(x.result()))
|
|
37
|
-
|
|
38
|
-
executor = dfk.executors[name]
|
|
39
|
-
provider = dfk.executors[name].provider
|
|
40
|
-
|
|
41
|
-
# At this point we should have 1 job
|
|
42
|
-
_, current_jobs = executor._get_block_and_job_ids()
|
|
43
|
-
assert len(current_jobs) == 1, "Expected 1 job at init, got {}".format(len(current_jobs))
|
|
44
|
-
|
|
45
|
-
logger.info("Getting provider status (1)")
|
|
46
|
-
status = provider.status(current_jobs)
|
|
47
|
-
logger.info("Got provider status")
|
|
48
|
-
assert status[0].state == JobState.RUNNING, "Expected job to be in state RUNNING"
|
|
49
|
-
|
|
50
|
-
# Scale down to 0
|
|
51
|
-
scale_in_blocks = executor.scale_in(blocks=1)
|
|
52
|
-
logger.info("Now sleeping 60 seconds")
|
|
53
|
-
time.sleep(60)
|
|
54
|
-
logger.info("Sleep finished")
|
|
55
|
-
logger.info("Getting provider status (2)")
|
|
56
|
-
status = executor.status()
|
|
57
|
-
logger.info("Got executor status")
|
|
58
|
-
logger.info("Block status: {}".format(status))
|
|
59
|
-
assert status[scale_in_blocks[0]].terminal is True, "Terminal state"
|
|
60
|
-
logger.info("Job in terminal state")
|
|
61
|
-
|
|
62
|
-
_, current_jobs = executor._get_block_and_job_ids()
|
|
63
|
-
# PR 1952 stoped removing scale_in blocks from self.blocks_to_job_id
|
|
64
|
-
# A new PR will handle removing blocks from self.block
|
|
65
|
-
# this includes failed/completed/canceled blocks
|
|
66
|
-
assert len(current_jobs) == 1, "Expected current_jobs == 1"
|
|
67
|
-
dfk.cleanup()
|
|
68
|
-
parsl.clear()
|
|
69
|
-
logger.info("Ended test_provider")
|
|
70
|
-
return True
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
if __name__ == '__main__':
|
|
74
|
-
|
|
75
|
-
parser = argparse.ArgumentParser()
|
|
76
|
-
parser.add_argument("-c", "--count", default="4",
|
|
77
|
-
help="Count of apps to launch")
|
|
78
|
-
parser.add_argument("-t", "--time", default="60",
|
|
79
|
-
help="Sleep time for each app")
|
|
80
|
-
|
|
81
|
-
parser.add_argument("-d", "--debug", action='store_true',
|
|
82
|
-
help="Count of apps to launch")
|
|
83
|
-
args = parser.parse_args()
|
|
84
|
-
|
|
85
|
-
if args.debug:
|
|
86
|
-
parsl.set_stream_logger()
|
|
87
|
-
|
|
88
|
-
x = test_provider()
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import argparse
|
|
2
|
-
|
|
3
|
-
import pytest
|
|
4
|
-
|
|
5
|
-
import parsl
|
|
6
|
-
from parsl.app.app import python_app
|
|
7
|
-
from parsl.tests.site_tests.site_config_selector import fresh_config
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
@python_app
|
|
11
|
-
def platform(sleep=10, stdout=None):
|
|
12
|
-
import platform
|
|
13
|
-
import time
|
|
14
|
-
time.sleep(sleep)
|
|
15
|
-
return platform.uname()
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
@pytest.mark.local
|
|
19
|
-
@pytest.mark.skip("The behaviour this test is testing is unclear: there is no guarantee that tasks will go to different nodes")
|
|
20
|
-
def test_platform(n=2, sleep_dur=10):
|
|
21
|
-
""" This should sleep to make sure that concurrent apps will go to different workers
|
|
22
|
-
on different nodes.
|
|
23
|
-
"""
|
|
24
|
-
config = fresh_config()
|
|
25
|
-
if config.executors[0].label == "htex_local":
|
|
26
|
-
return
|
|
27
|
-
|
|
28
|
-
parsl.load(fresh_config())
|
|
29
|
-
|
|
30
|
-
dfk = parsl.dfk()
|
|
31
|
-
name = list(dfk.executors.keys())[0]
|
|
32
|
-
print("Trying to get executor : ", name)
|
|
33
|
-
|
|
34
|
-
x = [platform(sleep=1) for i in range(2)]
|
|
35
|
-
print([i.result() for i in x])
|
|
36
|
-
|
|
37
|
-
print("Executor : ", dfk.executors[name])
|
|
38
|
-
print("Connected : ", dfk.executors[name].connected_workers())
|
|
39
|
-
print("Outstanding : ", dfk.executors[name].outstanding())
|
|
40
|
-
|
|
41
|
-
d = []
|
|
42
|
-
for i in range(0, n):
|
|
43
|
-
x = platform(sleep=sleep_dur)
|
|
44
|
-
d.append(x)
|
|
45
|
-
|
|
46
|
-
pinfo = set([i.result()for i in d])
|
|
47
|
-
assert len(pinfo) == 2, "Expected two nodes, instead got {}".format(pinfo)
|
|
48
|
-
|
|
49
|
-
print("Test passed")
|
|
50
|
-
|
|
51
|
-
dfk.cleanup()
|
|
52
|
-
parsl.clear()
|
|
53
|
-
return True
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
if __name__ == '__main__':
|
|
57
|
-
|
|
58
|
-
parser = argparse.ArgumentParser()
|
|
59
|
-
parser.add_argument("-c", "--count", default="4",
|
|
60
|
-
help="Count of apps to launch")
|
|
61
|
-
parser.add_argument("-t", "--time", default="60",
|
|
62
|
-
help="Sleep time for each app")
|
|
63
|
-
parser.add_argument("-d", "--debug", action='store_true',
|
|
64
|
-
help="Count of apps to launch")
|
|
65
|
-
args = parser.parse_args()
|
|
66
|
-
|
|
67
|
-
if args.debug:
|
|
68
|
-
parsl.set_stream_logger()
|
|
69
|
-
|
|
70
|
-
x = test_platform(n=int(args.count), sleep_dur=int(args.time))
|