parsl 2025.9.8__tar.gz → 2025.9.22__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.22}/PKG-INFO +2 -2
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/curvezmq.py +0 -16
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/execute_task.py +2 -8
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/flux/executor.py +3 -5
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/high_throughput/executor.py +10 -4
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/high_throughput/interchange.py +14 -4
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/high_throughput/mpi_resource_management.py +1 -7
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/high_throughput/process_worker_pool.py +5 -1
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/high_throughput/zmq_pipes.py +29 -43
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/radical/executor.py +2 -6
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/radical/rpex_worker.py +2 -2
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/monitoring.py +2 -2
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/multiprocessing.py +0 -49
- parsl-2025.9.22/parsl/serialize/__init__.py +13 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/serialize/facade.py +0 -32
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_curvezmq.py +0 -42
- parsl-2025.9.22/parsl/tests/test_execute_task.py +20 -0
- parsl-2025.9.22/parsl/tests/test_htex/test_command_concurrency_regression_1321.py +54 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_interchange_exit_bad_registration.py +2 -1
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_priority_queue.py +8 -2
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_zmq_binding.py +2 -1
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_mpi_apps/test_mpi_scheduler.py +18 -43
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/version.py +1 -1
- {parsl-2025.9.8 → parsl-2025.9.22/parsl.egg-info}/PKG-INFO +2 -2
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl.egg-info/SOURCES.txt +1 -7
- parsl-2025.9.8/parsl/serialize/__init__.py +0 -16
- 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_execute_task.py +0 -29
- parsl-2025.9.8/parsl/tests/test_regression/test_854.py +0 -62
- parsl-2025.9.8/parsl/tests/test_serialization/test_pack_resource_spec.py +0 -23
- {parsl-2025.9.8 → parsl-2025.9.22}/LICENSE +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/MANIFEST.in +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/README.rst +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/addresses.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/app/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/app/app.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/app/bash.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/app/errors.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/app/futures.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/app/python.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/benchmark/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/benchmark/perf.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/concurrent/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/config.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/ASPIRE1.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/Azure.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/anvil.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/bridges.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/cc_in2p3.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/delta.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/ec2.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/expanse.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/frontera.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/gc_multisite.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/gc_tutorial.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/htex_local.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/illinoiscluster.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/improv.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/kubernetes.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/local_threads.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/midway.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/osg.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/polaris.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/stampede2.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/summit.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/toss3_llnl.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/vineex_local.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/wqex_local.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/data_provider/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/data_provider/data_manager.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/data_provider/file_noop.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/data_provider/files.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/data_provider/ftp.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/data_provider/globus.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/data_provider/http.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/data_provider/rsync.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/data_provider/staging.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/data_provider/zip.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/dataflow/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/dataflow/dependency_resolvers.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/dataflow/dflow.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/dataflow/errors.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/dataflow/futures.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/dataflow/memoization.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/dataflow/rundirs.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/dataflow/states.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/dataflow/taskrecord.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/errors.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/base.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/errors.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/flux/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/flux/execute_parsl_task.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/flux/flux_instance_manager.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/globus_compute.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/high_throughput/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/high_throughput/errors.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/high_throughput/manager_record.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/high_throughput/manager_selector.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/high_throughput/monitoring_info.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/high_throughput/mpi_executor.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/high_throughput/mpi_prefix_composer.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/high_throughput/probe.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/radical/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/radical/rpex_resources.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/status_handling.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/taskvine/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/taskvine/errors.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/taskvine/exec_parsl_function.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/taskvine/executor.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/taskvine/factory.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/taskvine/factory_config.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/taskvine/manager.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/taskvine/manager_config.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/taskvine/utils.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/threads.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/workqueue/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/workqueue/errors.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/workqueue/exec_parsl_function.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/workqueue/executor.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/workqueue/parsl_coprocess.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/jobs/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/jobs/error_handlers.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/jobs/errors.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/jobs/job_status_poller.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/jobs/states.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/jobs/strategy.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/launchers/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/launchers/base.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/launchers/errors.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/launchers/launchers.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/log_utils.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/db_manager.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/errors.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/message_type.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/queries/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/queries/pandas.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/radios/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/radios/base.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/radios/filesystem.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/radios/filesystem_router.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/radios/htex.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/radios/multiprocessing.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/radios/udp.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/radios/udp_router.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/radios/zmq.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/radios/zmq_router.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/remote.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/types.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/app.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/models.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/plots/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/plots/default/workflow_plots.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/templates/app.html +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/templates/dag.html +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/templates/error.html +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/templates/layout.html +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/templates/task.html +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/templates/workflow.html +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/utils.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/version.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/views.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/process_loggers.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/aws/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/aws/aws.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/aws/template.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/azure/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/azure/azure.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/azure/template.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/base.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/cluster_provider.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/condor/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/condor/condor.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/condor/template.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/errors.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/googlecloud/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/googlecloud/googlecloud.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/grid_engine/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/grid_engine/grid_engine.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/grid_engine/template.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/kubernetes/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/kubernetes/kube.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/kubernetes/template.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/local/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/local/local.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/lsf/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/lsf/lsf.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/lsf/template.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/pbspro/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/pbspro/pbspro.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/pbspro/template.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/slurm/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/slurm/slurm.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/slurm/template.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/torque/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/torque/template.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/torque/torque.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/py.typed +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/serialize/base.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/serialize/concretes.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/serialize/errors.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/serialize/proxystore.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/callables_helper.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/azure_single_node.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/bluewaters.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/bridges.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/cc_in2p3.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/comet.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/ec2_single_node.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/ec2_spot.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/flux_local.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/frontera.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/globus_compute.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/htex_local.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/htex_local_alternate.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/htex_local_intask_staging.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/htex_local_rsync_staging.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/local_radical.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/local_radical_mpi.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/local_threads.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/local_threads_checkpoint_periodic.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/local_threads_globus.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/local_threads_no_cache.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/midway.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/nscc_singapore.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/osg_htex.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/petrelkube.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/slurm_local.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/summit.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/taskvine_ex.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/user_opts.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/workqueue_ex.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/conftest.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/integration/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/integration/latency.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/integration/test_apps/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/integration/test_stress/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/manual_tests/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/manual_tests/htex_local.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/manual_tests/test_basic.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/manual_tests/test_log_filter.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/manual_tests/test_memory_limits.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/manual_tests/test_regression_220.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/manual_tests/test_worker_count.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/site_tests/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/site_tests/site_config_selector.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/sites/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/sites/test_affinity.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/sites/test_concurrent.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/sites/test_dynamic_executor.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/sites/test_ec2.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/sites/test_launchers.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/sites/test_mpi/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/sites/test_worker_info.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_bash_apps/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_bash_apps/test_basic.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_bash_apps/test_inputs_default.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_bash_apps/test_memoize.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_bash_apps/test_multiline.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_bash_apps/test_pipeline.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_bash_apps/test_std_uri.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_bash_apps/test_stdout.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_callables.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_checkpointing/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_checkpointing/test_periodic.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_checkpointing/test_regression_233.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_checkpointing/test_task_exit.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_docs/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_docs/test_from_slides.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_docs/test_kwargs.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_docs/test_workflow1.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_docs/test_workflow4.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_error_handling/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_error_handling/test_fail.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_error_handling/test_python_walltime.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_error_handling/test_resource_spec.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_error_handling/test_retries.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_flowcontrol/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_flux.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_basic.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_block_manager_selector_unit.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_command_client_timeout.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_connected_blocks.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_cpu_affinity_explicit.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_disconnected_blocks.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_disconnected_blocks_failing_provider.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_drain.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_htex.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_manager_failure.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_manager_selector_by_block.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_managers_command.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_missing_worker.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_multiple_disconnected_blocks.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_resource_spec_validation.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_worker_failure.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_monitoring/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_monitoring/test_app_names.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_monitoring/test_basic.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_monitoring/test_exit_helper.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_monitoring/test_htex_fuzz_zmq.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_monitoring/test_incomplete_futures.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_monitoring/test_memoization_representation.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_monitoring/test_radio_filesystem.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_monitoring/test_radio_multiprocessing.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_monitoring/test_radio_udp.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_monitoring/test_radio_zmq.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_monitoring/test_stdouterr.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_mpi_apps/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_mpi_apps/test_bad_mpi_config.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_mpi_apps/test_mpi_prefix.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_mpi_apps/test_mpiex.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_mpi_apps/test_resource_spec.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_providers/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_providers/test_kubernetes_provider.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_providers/test_local_provider.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_providers/test_pbspro_template.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_providers/test_slurm_instantiate.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_providers/test_slurm_template.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_providers/test_submiterror_deprecation.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_basic.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_context_manager.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_dep_standard_futures.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_dependencies_deep.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_depfail_propagation.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_fail.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_futures.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_garbage_collect.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_inputs_default.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_join.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_lifted.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_mapred.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_memoize_2.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_memoize_exception.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_outputs.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_overview.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_pipeline.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_pluggable_future_resolution.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_simple.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_timeout.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_type5.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_radical/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_radical/test_mpi_funcs.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_regression/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_regression/test_1480.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_regression/test_1653.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_regression/test_221.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_regression/test_226.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_regression/test_2652.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_regression/test_69a.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_regression/test_97_parallelism_0.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_regression/test_98.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_scaling/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_scaling/test_block_error_handler.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_scaling/test_regression_1621.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_scaling/test_regression_3568_scaledown_vs_MISSING.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_scaling/test_regression_3696_oscillation.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_scaling/test_scale_down.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_scaling/test_shutdown_scalein.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_scaling/test_worker_interchange_bad_messages_3262.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_serialization/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_serialization/test_2555_caching_deserializer.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_serialization/test_3495_deserialize_managerlost.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_serialization/test_basic.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_serialization/test_htex_code_cache.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_serialization/test_proxystore_configured.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_serialization/test_proxystore_impl.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_shutdown/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_shutdown/test_kill_monitoring.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_staging/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_staging/staging_provider.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_staging/test_1316.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_staging/test_docs_1.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_staging/test_docs_2.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_staging/test_file.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_staging/test_file_apps.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_staging/test_file_staging.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_staging/test_output_chain_filenames.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_staging/test_staging_globus.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_staging/test_staging_https.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_staging/test_staging_stdout.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_staging/test_zip_in.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_staging/test_zip_out.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_staging/test_zip_to_zip.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_summary.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_thread_parallelism.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_threads/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_threads/test_configs.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_utils/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_utils/test_execute_wait.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_utils/test_logutils.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_utils/test_representation_mixin.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_utils/test_sanitize_dns.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/unit/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/unit/test_address.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/unit/test_file.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/unit/test_globus_compute_executor.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/unit/test_usage_tracking.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/utils.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/usage_tracking/__init__.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/usage_tracking/api.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/usage_tracking/levels.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/usage_tracking/usage.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl/utils.py +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl.egg-info/dependency_links.txt +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl.egg-info/entry_points.txt +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl.egg-info/requires.txt +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/parsl.egg-info/top_level.txt +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/requirements.txt +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/setup.cfg +0 -0
- {parsl-2025.9.8 → parsl-2025.9.22}/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.22
|
|
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.22.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
|
|
@@ -1,17 +1,11 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
from parsl.serialize import unpack_res_spec_apply_message
|
|
1
|
+
from parsl.serialize import unpack_apply_message
|
|
4
2
|
|
|
5
3
|
|
|
6
4
|
def execute_task(bufs: bytes):
|
|
7
5
|
"""Deserialize the buffer and execute the task.
|
|
8
6
|
Returns the result or throws exception.
|
|
9
7
|
"""
|
|
10
|
-
f, args, kwargs
|
|
11
|
-
|
|
12
|
-
for varname in resource_spec:
|
|
13
|
-
envname = "PARSL_" + str(varname).upper()
|
|
14
|
-
os.environ[envname] = str(resource_spec[varname])
|
|
8
|
+
f, args, kwargs = unpack_apply_message(bufs)
|
|
15
9
|
|
|
16
10
|
# We might need to look into callability of the function from itself
|
|
17
11
|
# since we change it's name in the new namespace
|
|
@@ -24,7 +24,7 @@ from parsl.executors.flux.execute_parsl_task import __file__ as _WORKER_PATH
|
|
|
24
24
|
from parsl.executors.flux.flux_instance_manager import __file__ as _MANAGER_PATH
|
|
25
25
|
from parsl.providers import LocalProvider
|
|
26
26
|
from parsl.providers.base import ExecutionProvider
|
|
27
|
-
from parsl.serialize import deserialize,
|
|
27
|
+
from parsl.serialize import deserialize, pack_apply_message
|
|
28
28
|
from parsl.serialize.errors import SerializationError
|
|
29
29
|
from parsl.utils import RepresentationMixin
|
|
30
30
|
|
|
@@ -284,10 +284,8 @@ class FluxExecutor(ParslExecutor, RepresentationMixin):
|
|
|
284
284
|
infile = os.path.join(self.working_dir, f"{task_id}_in{os.extsep}pkl")
|
|
285
285
|
outfile = os.path.join(self.working_dir, f"{task_id}_out{os.extsep}pkl")
|
|
286
286
|
try:
|
|
287
|
-
fn_buf =
|
|
288
|
-
func, args, kwargs,
|
|
289
|
-
resource_specification={},
|
|
290
|
-
buffer_threshold=1024 * 1024
|
|
287
|
+
fn_buf = pack_apply_message(
|
|
288
|
+
func, args, kwargs, buffer_threshold=1 << 20,
|
|
291
289
|
)
|
|
292
290
|
except TypeError:
|
|
293
291
|
raise SerializationError(func.__name__)
|
|
@@ -35,7 +35,7 @@ from parsl.monitoring.radios.zmq_router import ZMQRadioReceiver, start_zmq_recei
|
|
|
35
35
|
from parsl.process_loggers import wrap_with_logs
|
|
36
36
|
from parsl.providers import LocalProvider
|
|
37
37
|
from parsl.providers.base import ExecutionProvider
|
|
38
|
-
from parsl.serialize import deserialize,
|
|
38
|
+
from parsl.serialize import deserialize, pack_apply_message
|
|
39
39
|
from parsl.serialize.errors import DeserializationError, SerializationError
|
|
40
40
|
from parsl.usage_tracking.api import UsageInformation
|
|
41
41
|
from parsl.utils import RepresentationMixin
|
|
@@ -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)
|
|
@@ -700,9 +708,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
|
|
|
700
708
|
self.tasks[task_id] = fut
|
|
701
709
|
|
|
702
710
|
try:
|
|
703
|
-
fn_buf =
|
|
704
|
-
resource_specification=resource_specification,
|
|
705
|
-
buffer_threshold=1024 * 1024)
|
|
711
|
+
fn_buf = pack_apply_message(func, args, kwargs, buffer_threshold=1 << 20)
|
|
706
712
|
except TypeError:
|
|
707
713
|
raise SerializationError(func.__name__)
|
|
708
714
|
|
|
@@ -23,7 +23,6 @@ from parsl.monitoring.radios.base import MonitoringRadioSender
|
|
|
23
23
|
from parsl.monitoring.radios.zmq import ZMQRadioSender
|
|
24
24
|
from parsl.process_loggers import wrap_with_logs
|
|
25
25
|
from parsl.serialize import serialize as serialize_object
|
|
26
|
-
from parsl.utils import setproctitle
|
|
27
26
|
from parsl.version import VERSION as PARSL_VERSION
|
|
28
27
|
|
|
29
28
|
PKL_HEARTBEAT_CODE = pickle.dumps((2 ** 32) - 1)
|
|
@@ -56,6 +55,7 @@ class Interchange:
|
|
|
56
55
|
cert_dir: Optional[str],
|
|
57
56
|
manager_selector: ManagerSelector,
|
|
58
57
|
run_id: str,
|
|
58
|
+
_check_python_mismatch: bool,
|
|
59
59
|
) -> None:
|
|
60
60
|
"""
|
|
61
61
|
Parameters
|
|
@@ -99,6 +99,11 @@ class Interchange:
|
|
|
99
99
|
|
|
100
100
|
cert_dir : str | None
|
|
101
101
|
Path to the certificate directory.
|
|
102
|
+
|
|
103
|
+
_check_python_mismatch : bool
|
|
104
|
+
If True, the interchange and worker managers must run the same version of
|
|
105
|
+
Python. Running different versions can cause inter-process communication
|
|
106
|
+
errors, so proceed with caution.
|
|
102
107
|
"""
|
|
103
108
|
self.cert_dir = cert_dir
|
|
104
109
|
self.logdir = logdir
|
|
@@ -126,6 +131,7 @@ class Interchange:
|
|
|
126
131
|
logger.info("Connected to client")
|
|
127
132
|
|
|
128
133
|
self.run_id = run_id
|
|
134
|
+
self._check_python_mismatch = _check_python_mismatch
|
|
129
135
|
|
|
130
136
|
self.hub_address = hub_address
|
|
131
137
|
self.hub_zmq_port = hub_zmq_port
|
|
@@ -213,7 +219,7 @@ class Interchange:
|
|
|
213
219
|
|
|
214
220
|
reply: Any # the type of reply depends on the command_req received (aka this needs dependent types...)
|
|
215
221
|
|
|
216
|
-
if self.
|
|
222
|
+
if self.socks.get(self.command_channel) == zmq.POLLIN:
|
|
217
223
|
logger.debug("entering command_server section")
|
|
218
224
|
|
|
219
225
|
command_req = self.command_channel.recv_pyobj()
|
|
@@ -321,7 +327,7 @@ class Interchange:
|
|
|
321
327
|
"""Process incoming task message(s).
|
|
322
328
|
"""
|
|
323
329
|
|
|
324
|
-
if self.
|
|
330
|
+
if self.socks.get(self.task_incoming) == zmq.POLLIN:
|
|
325
331
|
logger.debug("start task_incoming section")
|
|
326
332
|
msg = self.task_incoming.recv_pyobj()
|
|
327
333
|
|
|
@@ -396,7 +402,9 @@ class Interchange:
|
|
|
396
402
|
logger.info(f'Registration info for manager {manager_id!r}: {meta}')
|
|
397
403
|
self._send_monitoring_info(monitoring_radio, new_rec)
|
|
398
404
|
|
|
399
|
-
|
|
405
|
+
python_mismatch: bool = ix_minor_py != mgr_minor_py
|
|
406
|
+
parsl_mismatch: bool = ix_parsl_v != mgr_parsl_v
|
|
407
|
+
if parsl_mismatch or (self._check_python_mismatch and python_mismatch):
|
|
400
408
|
kill_event.set()
|
|
401
409
|
vm_exc = VersionMismatch(
|
|
402
410
|
f"py.v={ix_minor_py} parsl.v={ix_parsl_v}",
|
|
@@ -618,6 +626,8 @@ def start_file_logger(filename: str, level: int = logging.DEBUG, format_string:
|
|
|
618
626
|
|
|
619
627
|
|
|
620
628
|
if __name__ == "__main__":
|
|
629
|
+
from parsl.utils import setproctitle
|
|
630
|
+
|
|
621
631
|
setproctitle("parsl: HTEX interchange")
|
|
622
632
|
|
|
623
633
|
config = pickle.load(sys.stdin.buffer)
|
{parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/high_throughput/mpi_resource_management.py
RENAMED
|
@@ -9,7 +9,6 @@ from enum import Enum
|
|
|
9
9
|
from typing import Dict, List, Optional
|
|
10
10
|
|
|
11
11
|
from parsl.multiprocessing import SpawnContext
|
|
12
|
-
from parsl.serialize import pack_res_spec_apply_message, unpack_res_spec_apply_message
|
|
13
12
|
|
|
14
13
|
logger = logging.getLogger(__name__)
|
|
15
14
|
|
|
@@ -167,9 +166,7 @@ class MPITaskScheduler(TaskScheduler):
|
|
|
167
166
|
|
|
168
167
|
def put_task(self, task_package: dict):
|
|
169
168
|
"""Schedule task if resources are available otherwise backlog the task"""
|
|
170
|
-
|
|
171
|
-
user_ns.update({"__builtins__": __builtins__})
|
|
172
|
-
_f, _args, _kwargs, resource_spec = unpack_res_spec_apply_message(task_package["buffer"])
|
|
169
|
+
resource_spec = task_package.get("resource_spec", {})
|
|
173
170
|
|
|
174
171
|
nodes_needed = resource_spec.get("num_nodes")
|
|
175
172
|
tid = task_package["task_id"]
|
|
@@ -183,9 +180,6 @@ class MPITaskScheduler(TaskScheduler):
|
|
|
183
180
|
else:
|
|
184
181
|
resource_spec["MPI_NODELIST"] = ",".join(allocated_nodes)
|
|
185
182
|
self._map_tasks_to_nodes[tid] = allocated_nodes
|
|
186
|
-
buffer = pack_res_spec_apply_message(_f, _args, _kwargs, resource_spec)
|
|
187
|
-
task_package["buffer"] = buffer
|
|
188
|
-
task_package["resource_spec"] = resource_spec
|
|
189
183
|
|
|
190
184
|
self.pending_task_q.put(task_package)
|
|
191
185
|
|
|
@@ -603,6 +603,10 @@ def update_resource_spec_env_vars(mpi_launcher: str, resource_spec: Dict, node_i
|
|
|
603
603
|
|
|
604
604
|
|
|
605
605
|
def _init_mpi_env(mpi_launcher: str, resource_spec: Dict):
|
|
606
|
+
for varname in resource_spec:
|
|
607
|
+
envname = "PARSL_" + str(varname).upper()
|
|
608
|
+
os.environ[envname] = str(resource_spec[varname])
|
|
609
|
+
|
|
606
610
|
node_list = resource_spec.get("MPI_NODELIST")
|
|
607
611
|
if node_list is None:
|
|
608
612
|
return
|
|
@@ -753,8 +757,8 @@ def worker(
|
|
|
753
757
|
worker_enqueued = True
|
|
754
758
|
|
|
755
759
|
try:
|
|
756
|
-
# The worker will receive {'task_id':<tid>, 'buffer':<buf>}
|
|
757
760
|
req = task_queue.get(timeout=task_queue_timeout)
|
|
761
|
+
# req is {'task_id':<tid>, 'buffer':<buf>, 'resource_spec':<dict>}
|
|
758
762
|
except queue.Empty:
|
|
759
763
|
continue
|
|
760
764
|
|
|
@@ -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()
|
|
@@ -20,7 +20,7 @@ from parsl.app.errors import BashExitFailure, RemoteExceptionWrapper
|
|
|
20
20
|
from parsl.app.python import timeout
|
|
21
21
|
from parsl.data_provider.files import File
|
|
22
22
|
from parsl.executors.base import ParslExecutor
|
|
23
|
-
from parsl.serialize import deserialize,
|
|
23
|
+
from parsl.serialize import deserialize, pack_apply_message
|
|
24
24
|
from parsl.serialize.errors import DeserializationError, SerializationError
|
|
25
25
|
from parsl.utils import RepresentationMixin
|
|
26
26
|
|
|
@@ -441,11 +441,7 @@ class RadicalPilotExecutor(ParslExecutor, RepresentationMixin):
|
|
|
441
441
|
|
|
442
442
|
def _pack_and_apply_message(self, func, args, kwargs):
|
|
443
443
|
try:
|
|
444
|
-
buffer =
|
|
445
|
-
args,
|
|
446
|
-
kwargs,
|
|
447
|
-
resource_specification={},
|
|
448
|
-
buffer_threshold=1024 * 1024)
|
|
444
|
+
buffer = pack_apply_message(func, args, kwargs, buffer_threshold=1 << 20)
|
|
449
445
|
task_func = rp.utils.serialize_bson(buffer)
|
|
450
446
|
except TypeError:
|
|
451
447
|
raise SerializationError(func.__name__)
|
|
@@ -5,7 +5,7 @@ import radical.pilot as rp
|
|
|
5
5
|
import parsl.app.errors as pe
|
|
6
6
|
from parsl.app.bash import remote_side_bash_executor
|
|
7
7
|
from parsl.executors.execute_task import execute_task
|
|
8
|
-
from parsl.serialize import serialize,
|
|
8
|
+
from parsl.serialize import serialize, unpack_apply_message
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
class ParslWorker:
|
|
@@ -33,7 +33,7 @@ class ParslWorker:
|
|
|
33
33
|
|
|
34
34
|
try:
|
|
35
35
|
buffer = rp.utils.deserialize_bson(task['description']['executable'])
|
|
36
|
-
func, args, kwargs
|
|
36
|
+
func, args, kwargs = unpack_apply_message(buffer)
|
|
37
37
|
ret = remote_side_bash_executor(func, *args, **kwargs)
|
|
38
38
|
exc = (None, None)
|
|
39
39
|
val = None
|
|
@@ -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
|
|
|
@@ -62,44 +62,12 @@ def pack_apply_message(func: Any, args: Any, kwargs: Any, buffer_threshold: int
|
|
|
62
62
|
return packed_buffer
|
|
63
63
|
|
|
64
64
|
|
|
65
|
-
def pack_res_spec_apply_message(func: Any, args: Any, kwargs: Any, resource_specification: Any, buffer_threshold: int = int(128 * 1e6)) -> bytes:
|
|
66
|
-
"""Serialize and pack function, parameters, and resource_specification
|
|
67
|
-
|
|
68
|
-
Parameters
|
|
69
|
-
----------
|
|
70
|
-
|
|
71
|
-
func: Function
|
|
72
|
-
A function to ship
|
|
73
|
-
|
|
74
|
-
args: Tuple/list of objects
|
|
75
|
-
positional parameters as a list
|
|
76
|
-
|
|
77
|
-
kwargs: Dict
|
|
78
|
-
Dict containing named parameters
|
|
79
|
-
|
|
80
|
-
resource_specification: Dict
|
|
81
|
-
Dict containing application resource specification
|
|
82
|
-
|
|
83
|
-
buffer_threshold: int
|
|
84
|
-
Limits buffer to specified size in bytes. Exceeding this limit would give you
|
|
85
|
-
a warning in the log. Default is 128MB.
|
|
86
|
-
"""
|
|
87
|
-
return pack_apply_message(func, args, (kwargs, resource_specification), buffer_threshold=buffer_threshold)
|
|
88
|
-
|
|
89
|
-
|
|
90
65
|
def unpack_apply_message(packed_buffer: bytes) -> List[Any]:
|
|
91
66
|
""" Unpack and deserialize function and parameters
|
|
92
67
|
"""
|
|
93
68
|
return [deserialize(buf) for buf in unpack_buffers(packed_buffer)]
|
|
94
69
|
|
|
95
70
|
|
|
96
|
-
def unpack_res_spec_apply_message(packed_buffer: bytes) -> List[Any]:
|
|
97
|
-
""" Unpack and deserialize function, parameters, and resource_specification
|
|
98
|
-
"""
|
|
99
|
-
func, args, (kwargs, resource_spec) = unpack_apply_message(packed_buffer)
|
|
100
|
-
return [func, args, kwargs, resource_spec]
|
|
101
|
-
|
|
102
|
-
|
|
103
71
|
def serialize(obj: Any, buffer_threshold: int = int(1e6)) -> bytes:
|
|
104
72
|
""" Try available serialization methods one at a time
|
|
105
73
|
|
|
@@ -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,20 @@
|
|
|
1
|
+
import os
|
|
2
|
+
|
|
3
|
+
import pytest
|
|
4
|
+
|
|
5
|
+
from parsl.executors.execute_task import execute_task
|
|
6
|
+
from parsl.serialize.facade import pack_apply_message
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def addemup(*args: int, name: str = "apples"):
|
|
10
|
+
total = sum(args)
|
|
11
|
+
return f"{total} {name}"
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@pytest.mark.local
|
|
15
|
+
def test_execute_task():
|
|
16
|
+
args = (1, 2, 3)
|
|
17
|
+
kwargs = {"name": "boots"}
|
|
18
|
+
buff = pack_apply_message(addemup, args, kwargs)
|
|
19
|
+
res = execute_task(buff)
|
|
20
|
+
assert res == addemup(*args, **kwargs)
|
|
@@ -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.22}/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)
|