parsl 2025.9.1__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.1/parsl.egg-info → parsl-2025.9.15}/PKG-INFO +2 -2
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/__init__.py +0 -4
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/curvezmq.py +0 -16
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/dataflow/dflow.py +1 -3
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/dataflow/memoization.py +0 -14
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/high_throughput/executor.py +8 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/high_throughput/interchange.py +26 -23
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/high_throughput/zmq_pipes.py +29 -43
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/db_manager.py +8 -8
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/monitoring.py +2 -2
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/radios/udp_router.py +2 -2
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/radios/zmq_router.py +2 -2
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/multiprocessing.py +0 -49
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +6 -3
- {parsl-2025.9.1 → 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.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_interchange_exit_bad_registration.py +2 -1
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_priority_queue.py +1 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_zmq_binding.py +2 -1
- parsl-2025.9.15/parsl/tests/test_python_apps/test_memoize_exception.py +41 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/version.py +1 -1
- {parsl-2025.9.1 → parsl-2025.9.15/parsl.egg-info}/PKG-INFO +2 -2
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl.egg-info/SOURCES.txt +2 -6
- parsl-2025.9.1/parsl/tests/site_tests/test_provider.py +0 -88
- parsl-2025.9.1/parsl/tests/site_tests/test_site.py +0 -70
- parsl-2025.9.1/parsl/tests/test_aalst_patterns.py +0 -474
- parsl-2025.9.1/parsl/tests/test_docs/test_workflow2.py +0 -42
- parsl-2025.9.1/parsl/tests/test_error_handling/test_rand_fail.py +0 -171
- parsl-2025.9.1/parsl/tests/test_regression/test_854.py +0 -62
- {parsl-2025.9.1 → parsl-2025.9.15}/LICENSE +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/MANIFEST.in +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/README.rst +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/addresses.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/app/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/app/app.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/app/bash.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/app/errors.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/app/futures.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/app/python.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/benchmark/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/benchmark/perf.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/concurrent/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/config.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/ASPIRE1.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/Azure.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/anvil.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/bridges.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/cc_in2p3.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/delta.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/ec2.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/expanse.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/frontera.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/gc_multisite.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/gc_tutorial.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/htex_local.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/illinoiscluster.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/improv.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/kubernetes.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/local_threads.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/midway.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/osg.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/polaris.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/stampede2.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/summit.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/toss3_llnl.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/vineex_local.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/wqex_local.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/data_provider/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/data_provider/data_manager.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/data_provider/file_noop.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/data_provider/files.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/data_provider/ftp.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/data_provider/globus.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/data_provider/http.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/data_provider/rsync.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/data_provider/staging.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/data_provider/zip.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/dataflow/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/dataflow/dependency_resolvers.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/dataflow/errors.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/dataflow/futures.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/dataflow/rundirs.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/dataflow/states.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/dataflow/taskrecord.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/errors.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/base.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/errors.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/execute_task.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/flux/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/flux/execute_parsl_task.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/flux/executor.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/flux/flux_instance_manager.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/globus_compute.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/high_throughput/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/high_throughput/errors.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/high_throughput/manager_record.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/high_throughput/manager_selector.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/high_throughput/monitoring_info.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/high_throughput/mpi_executor.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/high_throughput/mpi_prefix_composer.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/high_throughput/mpi_resource_management.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/high_throughput/probe.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/high_throughput/process_worker_pool.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/radical/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/radical/executor.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/radical/rpex_resources.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/radical/rpex_worker.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/status_handling.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/taskvine/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/taskvine/errors.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/taskvine/exec_parsl_function.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/taskvine/executor.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/taskvine/factory.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/taskvine/factory_config.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/taskvine/manager.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/taskvine/manager_config.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/taskvine/utils.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/threads.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/workqueue/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/workqueue/errors.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/workqueue/exec_parsl_function.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/workqueue/executor.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/workqueue/parsl_coprocess.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/jobs/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/jobs/error_handlers.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/jobs/errors.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/jobs/job_status_poller.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/jobs/states.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/jobs/strategy.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/launchers/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/launchers/base.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/launchers/errors.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/launchers/launchers.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/log_utils.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/errors.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/message_type.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/queries/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/queries/pandas.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/radios/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/radios/base.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/radios/filesystem.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/radios/filesystem_router.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/radios/htex.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/radios/multiprocessing.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/radios/udp.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/radios/zmq.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/remote.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/types.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/app.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/models.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/plots/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/plots/default/workflow_plots.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/templates/app.html +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/templates/dag.html +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/templates/error.html +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/templates/layout.html +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/templates/task.html +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/templates/workflow.html +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/utils.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/version.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/views.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/process_loggers.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/aws/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/aws/aws.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/aws/template.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/azure/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/azure/azure.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/azure/template.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/base.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/cluster_provider.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/condor/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/condor/condor.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/condor/template.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/errors.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/googlecloud/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/googlecloud/googlecloud.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/grid_engine/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/grid_engine/grid_engine.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/grid_engine/template.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/kubernetes/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/kubernetes/kube.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/kubernetes/template.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/local/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/local/local.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/lsf/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/lsf/lsf.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/lsf/template.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/pbspro/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/pbspro/pbspro.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/pbspro/template.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/slurm/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/slurm/slurm.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/slurm/template.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/torque/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/torque/template.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/torque/torque.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/py.typed +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/serialize/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/serialize/base.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/serialize/concretes.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/serialize/errors.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/serialize/facade.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/serialize/proxystore.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/callables_helper.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/azure_single_node.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/bluewaters.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/bridges.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/cc_in2p3.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/comet.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/ec2_single_node.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/ec2_spot.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/flux_local.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/frontera.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/globus_compute.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/htex_local.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/htex_local_alternate.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/htex_local_intask_staging.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/htex_local_rsync_staging.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/local_radical.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/local_radical_mpi.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/local_threads.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/local_threads_checkpoint_periodic.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/local_threads_globus.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/local_threads_no_cache.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/midway.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/nscc_singapore.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/osg_htex.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/petrelkube.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/slurm_local.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/summit.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/taskvine_ex.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/user_opts.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/workqueue_ex.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/conftest.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/integration/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/integration/latency.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/integration/test_apps/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/integration/test_stress/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/manual_tests/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/manual_tests/htex_local.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/manual_tests/test_basic.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/manual_tests/test_log_filter.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/manual_tests/test_memory_limits.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/manual_tests/test_regression_220.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/manual_tests/test_worker_count.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/site_tests/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/site_tests/site_config_selector.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/sites/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/sites/test_affinity.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/sites/test_concurrent.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/sites/test_dynamic_executor.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/sites/test_ec2.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/sites/test_launchers.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/sites/test_mpi/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/sites/test_worker_info.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_bash_apps/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_basic.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_inputs_default.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_memoize.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_multiline.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_pipeline.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_std_uri.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_stdout.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_callables.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_checkpointing/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_checkpointing/test_periodic.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_checkpointing/test_regression_233.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_checkpointing/test_task_exit.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_docs/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_docs/test_from_slides.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_docs/test_kwargs.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_docs/test_workflow1.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_docs/test_workflow4.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_error_handling/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_error_handling/test_fail.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_error_handling/test_python_walltime.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_error_handling/test_resource_spec.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_error_handling/test_retries.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_execute_task.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_flowcontrol/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_flux.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_basic.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_block_manager_selector_unit.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_command_client_timeout.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_connected_blocks.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_cpu_affinity_explicit.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_disconnected_blocks.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_disconnected_blocks_failing_provider.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_drain.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_htex.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_manager_failure.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_manager_selector_by_block.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_managers_command.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_missing_worker.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_multiple_disconnected_blocks.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_resource_spec_validation.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_worker_failure.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_monitoring/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_app_names.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_basic.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_exit_helper.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_htex_fuzz_zmq.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_incomplete_futures.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_memoization_representation.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_radio_filesystem.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_radio_multiprocessing.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_radio_udp.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_radio_zmq.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_stdouterr.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_mpi_apps/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_mpi_apps/test_bad_mpi_config.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_mpi_apps/test_mpi_prefix.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_mpi_apps/test_mpi_scheduler.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_mpi_apps/test_mpiex.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_mpi_apps/test_resource_spec.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_providers/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_providers/test_kubernetes_provider.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_providers/test_local_provider.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_providers/test_pbspro_template.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_providers/test_slurm_instantiate.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_providers/test_slurm_template.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_providers/test_submiterror_deprecation.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_basic.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_context_manager.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_dep_standard_futures.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_dependencies_deep.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_depfail_propagation.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_fail.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_futures.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_garbage_collect.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_inputs_default.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_join.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_lifted.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_mapred.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_memoize_2.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_outputs.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_overview.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_pipeline.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_pluggable_future_resolution.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_simple.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_timeout.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_type5.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_radical/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_radical/test_mpi_funcs.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_regression/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_regression/test_1480.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_regression/test_1653.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_regression/test_221.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_regression/test_226.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_regression/test_2652.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_regression/test_69a.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_regression/test_97_parallelism_0.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_regression/test_98.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_scaling/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_scaling/test_block_error_handler.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_scaling/test_regression_1621.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_scaling/test_regression_3568_scaledown_vs_MISSING.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_scaling/test_regression_3696_oscillation.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_scaling/test_scale_down.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_scaling/test_shutdown_scalein.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_scaling/test_worker_interchange_bad_messages_3262.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_serialization/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_serialization/test_2555_caching_deserializer.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_serialization/test_3495_deserialize_managerlost.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_serialization/test_basic.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_serialization/test_htex_code_cache.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_serialization/test_pack_resource_spec.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_serialization/test_proxystore_configured.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_serialization/test_proxystore_impl.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_shutdown/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_shutdown/test_kill_monitoring.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_staging/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_staging/staging_provider.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_staging/test_1316.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_staging/test_docs_1.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_staging/test_docs_2.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_staging/test_file.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_staging/test_file_apps.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_staging/test_file_staging.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_staging/test_output_chain_filenames.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_staging/test_staging_globus.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_staging/test_staging_https.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_staging/test_staging_stdout.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_staging/test_zip_in.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_staging/test_zip_out.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_staging/test_zip_to_zip.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_summary.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_thread_parallelism.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_threads/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_threads/test_configs.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_utils/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_utils/test_execute_wait.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_utils/test_logutils.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_utils/test_representation_mixin.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_utils/test_sanitize_dns.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/unit/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/unit/test_address.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/unit/test_file.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/unit/test_globus_compute_executor.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/unit/test_usage_tracking.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/utils.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/usage_tracking/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/usage_tracking/api.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/usage_tracking/levels.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/usage_tracking/usage.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl/utils.py +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl.egg-info/dependency_links.txt +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl.egg-info/entry_points.txt +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl.egg-info/requires.txt +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/parsl.egg-info/top_level.txt +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/requirements.txt +0 -0
- {parsl-2025.9.1 → parsl-2025.9.15}/setup.cfg +0 -0
- {parsl-2025.9.1 → 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
|
|
@@ -15,7 +15,6 @@ AUTO_LOGNAME
|
|
|
15
15
|
|
|
16
16
|
"""
|
|
17
17
|
import logging
|
|
18
|
-
import multiprocessing as _multiprocessing
|
|
19
18
|
import os
|
|
20
19
|
import platform
|
|
21
20
|
|
|
@@ -32,9 +31,6 @@ from parsl.log_utils import set_file_logger, set_stream_logger
|
|
|
32
31
|
from parsl.monitoring import MonitoringHub
|
|
33
32
|
from parsl.version import VERSION
|
|
34
33
|
|
|
35
|
-
if platform.system() == 'Darwin':
|
|
36
|
-
_multiprocessing.set_start_method('fork', force=True)
|
|
37
|
-
|
|
38
34
|
__author__ = 'The Parsl Team'
|
|
39
35
|
__version__ = VERSION
|
|
40
36
|
|
|
@@ -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
|
|
@@ -1267,7 +1267,7 @@ class DataFlowKernel:
|
|
|
1267
1267
|
# should still see it.
|
|
1268
1268
|
logger.info("DFK cleanup complete")
|
|
1269
1269
|
|
|
1270
|
-
def checkpoint(self, tasks: Optional[Sequence[TaskRecord]] = None) ->
|
|
1270
|
+
def checkpoint(self, tasks: Optional[Sequence[TaskRecord]] = None) -> None:
|
|
1271
1271
|
"""Checkpoint the dfk incrementally to a checkpoint file.
|
|
1272
1272
|
|
|
1273
1273
|
When called, every task that has been completed yet not
|
|
@@ -1328,8 +1328,6 @@ class DataFlowKernel:
|
|
|
1328
1328
|
else:
|
|
1329
1329
|
logger.info("Done checkpointing {} tasks".format(count))
|
|
1330
1330
|
|
|
1331
|
-
return checkpoint_dir
|
|
1332
|
-
|
|
1333
1331
|
@staticmethod
|
|
1334
1332
|
def _log_std_streams(task_record: TaskRecord) -> None:
|
|
1335
1333
|
tid = task_record['id']
|
|
@@ -242,20 +242,6 @@ class Memoizer:
|
|
|
242
242
|
assert isinstance(result, Future) or result is None
|
|
243
243
|
return result
|
|
244
244
|
|
|
245
|
-
def hash_lookup(self, hashsum: str) -> Future[Any]:
|
|
246
|
-
"""Lookup a hash in the memoization table.
|
|
247
|
-
|
|
248
|
-
Args:
|
|
249
|
-
- hashsum (str): The same hashes used to uniquely identify apps+inputs
|
|
250
|
-
|
|
251
|
-
Returns:
|
|
252
|
-
- Lookup result
|
|
253
|
-
|
|
254
|
-
Raises:
|
|
255
|
-
- KeyError: if hash not in table
|
|
256
|
-
"""
|
|
257
|
-
return self.memo_lookup_table[hashsum]
|
|
258
|
-
|
|
259
245
|
def update_memo(self, task: TaskRecord, r: Future[Any]) -> None:
|
|
260
246
|
"""Updates the memoization lookup table with the result from a task.
|
|
261
247
|
|
|
@@ -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
|
|
@@ -222,35 +229,29 @@ class Interchange:
|
|
|
222
229
|
reply = self.connected_block_history
|
|
223
230
|
|
|
224
231
|
elif command_req == "WORKERS":
|
|
225
|
-
|
|
226
|
-
for manager in self._ready_managers.values():
|
|
227
|
-
num_workers += manager['worker_count']
|
|
228
|
-
reply = num_workers
|
|
232
|
+
reply = sum(m['worker_count'] for m in self._ready_managers.values())
|
|
229
233
|
|
|
230
234
|
elif command_req == "MANAGERS":
|
|
231
235
|
reply = []
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
'python_version': m['python_version'],
|
|
247
|
-
'draining': m['draining']}
|
|
236
|
+
now = time.time()
|
|
237
|
+
for manager_id, m in self._ready_managers.items():
|
|
238
|
+
idle_duration = now - (m['idle_since'] or now)
|
|
239
|
+
resp = {
|
|
240
|
+
'manager': manager_id.decode('utf-8'),
|
|
241
|
+
'block_id': m['block_id'],
|
|
242
|
+
'worker_count': m['worker_count'],
|
|
243
|
+
'tasks': len(m['tasks']),
|
|
244
|
+
'idle_duration': idle_duration,
|
|
245
|
+
'active': m['active'],
|
|
246
|
+
'parsl_version': m['parsl_version'],
|
|
247
|
+
'python_version': m['python_version'],
|
|
248
|
+
'draining': m['draining']
|
|
249
|
+
}
|
|
248
250
|
reply.append(resp)
|
|
249
251
|
|
|
250
252
|
elif command_req == "MANAGERS_PACKAGES":
|
|
251
253
|
reply = {}
|
|
252
|
-
for manager_id in self._ready_managers:
|
|
253
|
-
m = self._ready_managers[manager_id]
|
|
254
|
+
for manager_id, m in self._ready_managers.items():
|
|
254
255
|
manager_id_str = manager_id.decode('utf-8')
|
|
255
256
|
reply[manager_id_str] = m["packages"]
|
|
256
257
|
|
|
@@ -402,7 +403,9 @@ class Interchange:
|
|
|
402
403
|
logger.info(f'Registration info for manager {manager_id!r}: {meta}')
|
|
403
404
|
self._send_monitoring_info(monitoring_radio, new_rec)
|
|
404
405
|
|
|
405
|
-
|
|
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):
|
|
406
409
|
kill_event.set()
|
|
407
410
|
vm_exc = VersionMismatch(
|
|
408
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()
|
|
@@ -346,9 +346,9 @@ class DatabaseManager:
|
|
|
346
346
|
exception_happened = False
|
|
347
347
|
|
|
348
348
|
while (not self._kill_event.is_set() or
|
|
349
|
-
self.pending_priority_queue.
|
|
350
|
-
self.pending_node_queue.
|
|
351
|
-
resource_queue.
|
|
349
|
+
not self.pending_priority_queue.empty() or not self.pending_resource_queue.empty() or
|
|
350
|
+
not self.pending_node_queue.empty() or not self.pending_block_queue.empty() or
|
|
351
|
+
not resource_queue.empty()):
|
|
352
352
|
|
|
353
353
|
"""
|
|
354
354
|
WORKFLOW_INFO and TASK_INFO messages (i.e. priority messages)
|
|
@@ -357,9 +357,9 @@ class DatabaseManager:
|
|
|
357
357
|
try:
|
|
358
358
|
logger.debug("""Checking STOP conditions: {}, {}, {}, {}, {}, {}""".format(
|
|
359
359
|
self._kill_event.is_set(),
|
|
360
|
-
self.pending_priority_queue.
|
|
361
|
-
self.pending_node_queue.
|
|
362
|
-
resource_queue.
|
|
360
|
+
not self.pending_priority_queue.empty(), not self.pending_resource_queue.empty(),
|
|
361
|
+
not self.pending_node_queue.empty(), not self.pending_block_queue.empty(),
|
|
362
|
+
not resource_queue.empty()))
|
|
363
363
|
|
|
364
364
|
# This is the list of resource messages which can be reprocessed as if they
|
|
365
365
|
# had just arrived because the corresponding first task message has been
|
|
@@ -558,9 +558,9 @@ class DatabaseManager:
|
|
|
558
558
|
def _migrate_logs_to_internal(self, logs_queue: mpq.Queue, kill_event: threading.Event) -> None:
|
|
559
559
|
logger.info("Starting _migrate_logs_to_internal")
|
|
560
560
|
|
|
561
|
-
while not kill_event.is_set() or logs_queue.
|
|
561
|
+
while not kill_event.is_set() or not logs_queue.empty():
|
|
562
562
|
logger.debug("Checking STOP conditions: kill event: %s, queue has entries: %s",
|
|
563
|
-
kill_event.is_set(), logs_queue.
|
|
563
|
+
kill_event.is_set(), not logs_queue.empty())
|
|
564
564
|
|
|
565
565
|
try:
|
|
566
566
|
x = logs_queue.get(timeout=0.1)
|
|
@@ -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()
|
|
@@ -21,9 +21,9 @@ from parsl.monitoring.errors import MonitoringRouterStartError
|
|
|
21
21
|
from parsl.monitoring.radios.base import MonitoringRadioReceiver
|
|
22
22
|
from parsl.monitoring.radios.multiprocessing import MultiprocessingQueueRadioSender
|
|
23
23
|
from parsl.multiprocessing import (
|
|
24
|
-
SizedQueue,
|
|
25
24
|
SpawnEvent,
|
|
26
25
|
SpawnProcess,
|
|
26
|
+
SpawnQueue,
|
|
27
27
|
join_terminate_close_proc,
|
|
28
28
|
)
|
|
29
29
|
from parsl.process_loggers import wrap_with_logs
|
|
@@ -198,7 +198,7 @@ def start_udp_receiver(*,
|
|
|
198
198
|
hmac_digest: str) -> UDPRadioReceiver:
|
|
199
199
|
|
|
200
200
|
udp_comm_q: Queue[Union[int, str]]
|
|
201
|
-
udp_comm_q =
|
|
201
|
+
udp_comm_q = SpawnQueue(maxsize=10)
|
|
202
202
|
|
|
203
203
|
router_exit_event = SpawnEvent()
|
|
204
204
|
|
|
@@ -19,9 +19,9 @@ from parsl.monitoring.errors import MonitoringRouterStartError
|
|
|
19
19
|
from parsl.monitoring.radios.multiprocessing import MultiprocessingQueueRadioSender
|
|
20
20
|
from parsl.monitoring.types import TaggedMonitoringMessage
|
|
21
21
|
from parsl.multiprocessing import (
|
|
22
|
-
SizedQueue,
|
|
23
22
|
SpawnEvent,
|
|
24
23
|
SpawnProcess,
|
|
24
|
+
SpawnQueue,
|
|
25
25
|
join_terminate_close_proc,
|
|
26
26
|
)
|
|
27
27
|
from parsl.process_loggers import wrap_with_logs
|
|
@@ -158,7 +158,7 @@ def start_zmq_receiver(*,
|
|
|
158
158
|
port_range: Tuple[int, int],
|
|
159
159
|
logdir: str,
|
|
160
160
|
worker_debug: bool) -> ZMQRadioReceiver:
|
|
161
|
-
comm_q =
|
|
161
|
+
comm_q = SpawnQueue(maxsize=10)
|
|
162
162
|
|
|
163
163
|
router_exit_event = SpawnEvent()
|
|
164
164
|
|
|
@@ -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
|
|
{parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py
RENAMED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import os
|
|
2
|
+
from pathlib import Path
|
|
2
3
|
|
|
3
4
|
import pytest
|
|
4
5
|
|
|
@@ -20,12 +21,14 @@ def uuid_app():
|
|
|
20
21
|
|
|
21
22
|
|
|
22
23
|
@pytest.mark.local
|
|
23
|
-
def test_initial_checkpoint_write():
|
|
24
|
+
def test_initial_checkpoint_write() -> None:
|
|
24
25
|
"""1. Launch a few apps and write the checkpoint once a few have completed
|
|
25
26
|
"""
|
|
26
27
|
uuid_app().result()
|
|
27
28
|
|
|
28
|
-
|
|
29
|
+
parsl.dfk().checkpoint()
|
|
29
30
|
|
|
30
|
-
|
|
31
|
+
cpt_dir = Path(parsl.dfk().run_dir) / 'checkpoint'
|
|
32
|
+
|
|
33
|
+
cptpath = cpt_dir / 'tasks.pkl'
|
|
31
34
|
assert os.path.exists(cptpath), f"Tasks checkpoint missing: {cptpath}"
|
|
@@ -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.1 → 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)
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import parsl
|
|
2
|
+
from parsl.app.app import python_app
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
@python_app(cache=True)
|
|
6
|
+
def raise_exception_cache(x, cache=True):
|
|
7
|
+
raise RuntimeError("exception from raise_exception_cache")
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@python_app(cache=False)
|
|
11
|
+
def raise_exception_nocache(x, cache=True):
|
|
12
|
+
raise RuntimeError("exception from raise_exception_nocache")
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def test_python_memoization(n=2):
|
|
16
|
+
"""Test Python memoization of exceptions, with cache=True"""
|
|
17
|
+
x = raise_exception_cache(0)
|
|
18
|
+
|
|
19
|
+
# wait for x to be done
|
|
20
|
+
x.exception()
|
|
21
|
+
|
|
22
|
+
for i in range(0, n):
|
|
23
|
+
fut = raise_exception_cache(0)
|
|
24
|
+
|
|
25
|
+
# check that we get back the same exception object, rather than
|
|
26
|
+
# a new one from a second invocation of raise_exception().
|
|
27
|
+
assert fut.exception() is x.exception(), "Memoized exception should have been memoized"
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def test_python_no_memoization(n=2):
|
|
31
|
+
"""Test Python non-memoization of exceptions, with cache=False"""
|
|
32
|
+
x = raise_exception_nocache(0)
|
|
33
|
+
|
|
34
|
+
# wait for x to be done
|
|
35
|
+
x.exception()
|
|
36
|
+
|
|
37
|
+
for i in range(0, n):
|
|
38
|
+
fut = raise_exception_nocache(0)
|
|
39
|
+
|
|
40
|
+
# check that we get back a different exception object each time
|
|
41
|
+
assert fut.exception() is not x.exception(), "Memoized exception should have been memoized"
|