parsl 2024.1.29__tar.gz → 2024.2.5__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.
- {parsl-2024.1.29/parsl.egg-info → parsl-2024.2.5}/PKG-INFO +2 -2
- parsl-2024.2.5/parsl/curvezmq.py +205 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/dataflow/dflow.py +1 -1
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/high_throughput/executor.py +78 -49
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/high_throughput/interchange.py +14 -7
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/high_throughput/process_worker_pool.py +15 -7
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/high_throughput/zmq_pipes.py +21 -15
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/taskvine/manager.py +44 -43
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/monitoring.py +18 -3
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/errors.py +4 -6
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/slurm/slurm.py +7 -6
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/ad_hoc_cluster_htex.py +1 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/azure_single_node.py +1 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/bluewaters.py +1 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/bridges.py +1 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/cc_in2p3.py +1 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/comet.py +1 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/cooley_htex.py +1 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/ec2_single_node.py +1 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/ec2_spot.py +1 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/frontera.py +1 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/htex_ad_hoc_cluster.py +1 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/htex_local.py +1 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/htex_local_alternate.py +1 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/htex_local_intask_staging.py +1 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/htex_local_rsync_staging.py +1 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/local_adhoc.py +1 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/midway.py +1 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/nscc_singapore.py +1 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/osg_htex.py +1 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/petrelkube.py +1 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/summit.py +1 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/swan_htex.py +1 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/theta.py +1 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/manual_tests/htex_local.py +1 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/manual_tests/test_ad_hoc_htex.py +1 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/manual_tests/test_fan_in_out_htex_remote.py +1 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/manual_tests/test_memory_limits.py +1 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/scaling_tests/htex_local.py +1 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/sites/test_affinity.py +1 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/sites/test_concurrent.py +2 -1
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/sites/test_dynamic_executor.py +1 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/sites/test_worker_info.py +1 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_bash_apps/test_stdout.py +6 -1
- parsl-2024.2.5/parsl/tests/test_curvezmq.py +455 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_data/test_file_apps.py +5 -5
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_data/test_file_staging.py +3 -3
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_docs/test_kwargs.py +3 -3
- parsl-2024.2.5/parsl/tests/test_htex/test_htex.py +46 -0
- parsl-2024.2.5/parsl/tests/test_htex/test_htex_zmq_binding.py +86 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_futures.py +5 -5
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_regression/test_97_parallelism_0.py +1 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_scaling/test_block_error_handler.py +6 -5
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_scaling/test_regression_1621.py +1 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_scaling/test_scale_down.py +1 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/version.py +1 -1
- {parsl-2024.1.29 → parsl-2024.2.5/parsl.egg-info}/PKG-INFO +2 -2
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl.egg-info/SOURCES.txt +3 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl.egg-info/requires.txt +1 -1
- parsl-2024.2.5/requirements.txt +17 -0
- parsl-2024.1.29/parsl/tests/test_htex/test_htex_zmq_binding.py +0 -46
- parsl-2024.1.29/requirements.txt +0 -10
- {parsl-2024.1.29 → parsl-2024.2.5}/LICENSE +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/MANIFEST.in +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/README.rst +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/addresses.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/app/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/app/app.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/app/bash.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/app/errors.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/app/futures.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/app/python.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/benchmark/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/benchmark/perf.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/channels/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/channels/base.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/channels/errors.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/channels/local/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/channels/local/local.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/channels/oauth_ssh/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/channels/oauth_ssh/oauth_ssh.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/channels/ssh/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/channels/ssh/ssh.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/channels/ssh_il/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/channels/ssh_il/ssh_il.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/concurrent/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/config.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/ASPIRE1.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/Azure.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/ad_hoc.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/bluewaters.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/bridges.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/cc_in2p3.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/comet.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/cooley.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/ec2.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/frontera.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/htex_local.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/illinoiscluster.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/kubernetes.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/local_threads.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/midway.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/osg.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/polaris.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/stampede2.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/summit.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/theta.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/toss3_llnl.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/vineex_local.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/configs/wqex_local.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/data_provider/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/data_provider/data_manager.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/data_provider/file_noop.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/data_provider/files.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/data_provider/ftp.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/data_provider/globus.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/data_provider/http.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/data_provider/rsync.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/data_provider/staging.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/dataflow/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/dataflow/errors.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/dataflow/futures.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/dataflow/memoization.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/dataflow/rundirs.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/dataflow/states.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/dataflow/taskrecord.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/errors.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/base.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/errors.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/flux/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/flux/execute_parsl_task.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/flux/executor.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/flux/flux_instance_manager.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/high_throughput/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/high_throughput/errors.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/high_throughput/manager_record.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/high_throughput/monitoring_info.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/high_throughput/probe.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/radical/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/radical/executor.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/radical/rpex_master.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/radical/rpex_resources.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/radical/rpex_worker.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/status_handling.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/taskvine/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/taskvine/errors.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/taskvine/exec_parsl_function.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/taskvine/executor.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/taskvine/factory.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/taskvine/factory_config.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/taskvine/manager_config.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/taskvine/utils.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/threads.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/workqueue/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/workqueue/errors.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/workqueue/exec_parsl_function.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/workqueue/executor.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/workqueue/parsl_coprocess.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/jobs/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/jobs/error_handlers.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/jobs/errors.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/jobs/job_status_poller.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/jobs/states.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/jobs/strategy.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/launchers/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/launchers/base.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/launchers/errors.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/launchers/launchers.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/log_utils.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/db_manager.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/message_type.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/queries/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/queries/pandas.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/radios.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/remote.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/types.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/app.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/models.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/plots/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/plots/default/workflow_plots.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/templates/app.html +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/templates/dag.html +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/templates/error.html +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/templates/layout.html +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/templates/task.html +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/templates/workflow.html +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/utils.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/version.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/monitoring/visualization/views.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/multiprocessing.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/process_loggers.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/ad_hoc/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/ad_hoc/ad_hoc.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/aws/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/aws/aws.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/aws/template.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/azure/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/azure/azure.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/azure/template.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/base.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/cluster_provider.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/cobalt/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/cobalt/cobalt.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/cobalt/template.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/condor/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/condor/condor.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/condor/template.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/googlecloud/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/googlecloud/googlecloud.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/grid_engine/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/grid_engine/grid_engine.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/grid_engine/template.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/kubernetes/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/kubernetes/kube.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/kubernetes/template.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/local/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/local/local.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/lsf/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/lsf/lsf.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/lsf/template.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/pbspro/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/pbspro/pbspro.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/pbspro/template.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/slurm/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/slurm/template.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/torque/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/torque/template.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/providers/torque/torque.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/py.typed +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/serialize/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/serialize/base.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/serialize/concretes.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/serialize/errors.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/serialize/facade.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/serialize/proxystore.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/callables_helper.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/local_radical.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/local_radical_mpi.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/local_threads.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/local_threads_checkpoint_periodic.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/local_threads_globus.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/local_threads_monitoring.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/local_threads_no_cache.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/taskvine_ex.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/user_opts.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/configs/workqueue_ex.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/conftest.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/integration/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/integration/latency.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/integration/test_apps/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/integration/test_channels/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/integration/test_channels/test_channels.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/integration/test_channels/test_local_channel.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/integration/test_channels/test_scp_1.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/integration/test_channels/test_ssh_1.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/integration/test_channels/test_ssh_errors.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/integration/test_channels/test_ssh_file_transport.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/integration/test_channels/test_ssh_interactive.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/integration/test_stress/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/manual_tests/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/manual_tests/test_basic.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/manual_tests/test_log_filter.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/manual_tests/test_oauth_ssh.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/manual_tests/test_regression_220.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/manual_tests/test_udp_simple.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/manual_tests/test_worker_count.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/scaling_tests/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/scaling_tests/local_threads.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/scaling_tests/test_scale.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/scaling_tests/vineex_condor.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/scaling_tests/vineex_local.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/scaling_tests/wqex_condor.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/scaling_tests/wqex_local.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/site_tests/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/site_tests/site_config_selector.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/site_tests/test_provider.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/site_tests/test_site.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/sites/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/sites/test_ec2.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/sites/test_launchers.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/sites/test_local_adhoc.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/sites/test_mpi/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_aalst_patterns.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_bash_apps/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_bash_apps/test_basic.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_bash_apps/test_memoize.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_bash_apps/test_multiline.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_bash_apps/test_pipeline.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_callables.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_channels/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_channels/test_large_output.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_checkpointing/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_checkpointing/test_periodic.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_checkpointing/test_python_checkpoint_3.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_checkpointing/test_regression_233.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_checkpointing/test_task_exit.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_data/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_data/test_file.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_data/test_output_chain_filenames.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_docs/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_docs/test_from_slides.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_docs/test_workflow1.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_docs/test_workflow2.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_docs/test_workflow4.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_error_handling/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_error_handling/test_fail.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_error_handling/test_htex_basic.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_error_handling/test_htex_manager_failure.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_error_handling/test_htex_missing_worker.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_error_handling/test_htex_worker_failure.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_error_handling/test_python_walltime.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_error_handling/test_rand_fail.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_error_handling/test_resource_spec.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_error_handling/test_retries.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_flowcontrol/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_flux.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_htex/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_htex/test_cpu_affinity_explicit.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_monitoring/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_monitoring/test_basic.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_monitoring/test_fuzz_zmq.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_monitoring/test_memoization_representation.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_providers/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_providers/test_local_provider.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_providers/test_slurm_instantiate.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_providers/test_submiterror_deprecation.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_basic.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_dep_standard_futures.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_depfail_propagation.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_fail.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_garbage_collect.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_join.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_lifted.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_mapred.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_memoize_2.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_outputs.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_overview.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_pipeline.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_simple.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_timeout.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_python_apps/test_type5.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_radical/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_radical/test_mpi_funcs.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_regression/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_regression/test_1480.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_regression/test_1653.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_regression/test_221.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_regression/test_226.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_regression/test_2652.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_regression/test_69a.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_regression/test_854.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_regression/test_98.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_scaling/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_serialization/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_serialization/test_2555_caching_deserializer.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_serialization/test_basic.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_serialization/test_proxystore_configured.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_serialization/test_proxystore_impl.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_staging/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_staging/staging_provider.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_staging/test_1316.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_staging/test_docs_1.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_staging/test_docs_2.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_staging/test_staging_globus.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_staging/test_staging_https.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_summary.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_thread_parallelism.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_threads/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_threads/test_configs.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_utils/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/test_utils/test_representation_mixin.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/tests/utils.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/usage_tracking/__init__.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/usage_tracking/usage.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl/utils.py +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl.egg-info/dependency_links.txt +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl.egg-info/entry_points.txt +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/parsl.egg-info/top_level.txt +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/setup.cfg +0 -0
- {parsl-2024.1.29 → parsl-2024.2.5}/setup.py +0 -0
@@ -1,9 +1,9 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: parsl
|
3
|
-
Version: 2024.
|
3
|
+
Version: 2024.2.5
|
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/2024.
|
6
|
+
Download-URL: https://github.com/Parsl/parsl/archive/2024.02.05.tar.gz
|
7
7
|
Author: The Parsl Team
|
8
8
|
Author-email: parsl@googlegroups.com
|
9
9
|
License: Apache 2.0
|
@@ -0,0 +1,205 @@
|
|
1
|
+
import os
|
2
|
+
from abc import ABCMeta, abstractmethod
|
3
|
+
from typing import Optional, Tuple, Union
|
4
|
+
|
5
|
+
import zmq
|
6
|
+
import zmq.auth
|
7
|
+
from zmq.auth.thread import ThreadAuthenticator
|
8
|
+
|
9
|
+
|
10
|
+
def create_certificates(base_dir: Union[str, os.PathLike]):
|
11
|
+
"""Create server and client certificates in a private directory.
|
12
|
+
|
13
|
+
This will overwrite existing certificate files.
|
14
|
+
|
15
|
+
Parameters
|
16
|
+
----------
|
17
|
+
base_dir : str | os.PathLike
|
18
|
+
Parent directory of the private certificates directory.
|
19
|
+
"""
|
20
|
+
cert_dir = os.path.join(base_dir, "certificates")
|
21
|
+
os.makedirs(cert_dir, mode=0o700, exist_ok=True)
|
22
|
+
|
23
|
+
zmq.auth.create_certificates(cert_dir, name="server")
|
24
|
+
zmq.auth.create_certificates(cert_dir, name="client")
|
25
|
+
|
26
|
+
return cert_dir
|
27
|
+
|
28
|
+
|
29
|
+
def _load_certificate(
|
30
|
+
cert_dir: Union[str, os.PathLike], name: str
|
31
|
+
) -> Tuple[bytes, bytes]:
|
32
|
+
if os.stat(cert_dir).st_mode & 0o777 != 0o700:
|
33
|
+
raise OSError(f"The certificates directory must be private: {cert_dir}")
|
34
|
+
|
35
|
+
# pyzmq creates secret key files with the '.key_secret' extension
|
36
|
+
# Ref: https://github.com/zeromq/pyzmq/blob/ae615d4097ccfbc6b5c17de60355cbe6e00a6065/zmq/auth/certs.py#L73
|
37
|
+
secret_key_file = os.path.join(cert_dir, f"{name}.key_secret")
|
38
|
+
public_key, secret_key = zmq.auth.load_certificate(secret_key_file)
|
39
|
+
if secret_key is None:
|
40
|
+
raise ValueError(f"No secret key found in {secret_key_file}")
|
41
|
+
|
42
|
+
return public_key, secret_key
|
43
|
+
|
44
|
+
|
45
|
+
class BaseContext(metaclass=ABCMeta):
|
46
|
+
"""Base CurveZMQ context"""
|
47
|
+
|
48
|
+
def __init__(self, cert_dir: Optional[Union[str, os.PathLike]]) -> None:
|
49
|
+
self.cert_dir = cert_dir
|
50
|
+
self._ctx = zmq.Context()
|
51
|
+
|
52
|
+
@property
|
53
|
+
def encrypted(self):
|
54
|
+
"""Indicates whether encryption is enabled.
|
55
|
+
|
56
|
+
False (disabled) when self.cert_dir is set to None.
|
57
|
+
"""
|
58
|
+
return self.cert_dir is not None
|
59
|
+
|
60
|
+
@property
|
61
|
+
def closed(self):
|
62
|
+
return self._ctx.closed
|
63
|
+
|
64
|
+
@abstractmethod
|
65
|
+
def socket(self, socket_type: int, *args, **kwargs) -> zmq.Socket:
|
66
|
+
"""Create a socket associated with this context.
|
67
|
+
|
68
|
+
This method will apply all necessary certificates and socket options.
|
69
|
+
|
70
|
+
Parameters
|
71
|
+
----------
|
72
|
+
socket_type : int
|
73
|
+
The socket type, which can be any of the 0MQ socket types: REQ, REP,
|
74
|
+
PUB, SUB, PAIR, DEALER, ROUTER, PULL, PUSH, etc.
|
75
|
+
|
76
|
+
args:
|
77
|
+
passed to the zmq.Context.socket method.
|
78
|
+
|
79
|
+
kwargs:
|
80
|
+
passed to the zmq.Context.socket method.
|
81
|
+
"""
|
82
|
+
...
|
83
|
+
|
84
|
+
def term(self):
|
85
|
+
"""Terminate the context."""
|
86
|
+
self._ctx.term()
|
87
|
+
|
88
|
+
def destroy(self, linger: Optional[int] = None):
|
89
|
+
"""Close all sockets associated with this context and then terminate
|
90
|
+
the context.
|
91
|
+
|
92
|
+
.. warning::
|
93
|
+
|
94
|
+
destroy involves calling ``zmq_close()``, which is **NOT** threadsafe.
|
95
|
+
If there are active sockets in other threads, this must not be called.
|
96
|
+
|
97
|
+
Parameters
|
98
|
+
----------
|
99
|
+
linger : int, optional
|
100
|
+
If specified, set LINGER on sockets prior to closing them.
|
101
|
+
"""
|
102
|
+
self._ctx.destroy(linger)
|
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
|
+
|
116
|
+
class ServerContext(BaseContext):
|
117
|
+
"""CurveZMQ server context
|
118
|
+
|
119
|
+
We create server sockets via the `ctx.socket` method, which automatically
|
120
|
+
applies the necessary certificates and socket options.
|
121
|
+
|
122
|
+
We handle client certificate authentication in a separate dedicated thread.
|
123
|
+
|
124
|
+
Parameters
|
125
|
+
----------
|
126
|
+
cert_dir : str | os.PathLike | None
|
127
|
+
Path to the certificate directory. Setting this to None will disable encryption.
|
128
|
+
"""
|
129
|
+
|
130
|
+
def __init__(self, cert_dir: Optional[Union[str, os.PathLike]]) -> None:
|
131
|
+
super().__init__(cert_dir)
|
132
|
+
self.auth_thread = None
|
133
|
+
if self.encrypted:
|
134
|
+
self.auth_thread = self._start_auth_thread()
|
135
|
+
|
136
|
+
def __del__(self):
|
137
|
+
# Avoid issues in which the auth_thread attr was
|
138
|
+
# previously deleted
|
139
|
+
if getattr(self, "auth_thread", None):
|
140
|
+
self.auth_thread.stop()
|
141
|
+
|
142
|
+
def _start_auth_thread(self) -> ThreadAuthenticator:
|
143
|
+
auth_thread = ThreadAuthenticator(self._ctx)
|
144
|
+
auth_thread.start()
|
145
|
+
# Only allow certs that are in the cert dir
|
146
|
+
assert self.cert_dir # For mypy
|
147
|
+
auth_thread.configure_curve(domain="*", location=self.cert_dir)
|
148
|
+
return auth_thread
|
149
|
+
|
150
|
+
def socket(self, socket_type: int, *args, **kwargs) -> zmq.Socket:
|
151
|
+
sock = self._ctx.socket(socket_type, *args, **kwargs)
|
152
|
+
if self.encrypted:
|
153
|
+
assert self.cert_dir # For mypy
|
154
|
+
_, secret_key = _load_certificate(self.cert_dir, name="server")
|
155
|
+
try:
|
156
|
+
# Only the clients need the server's public key to encrypt
|
157
|
+
# messages and verify the server's identity.
|
158
|
+
# Ref: http://curvezmq.org/page:read-the-docs
|
159
|
+
sock.setsockopt(zmq.CURVE_SECRETKEY, secret_key)
|
160
|
+
except zmq.ZMQError as e:
|
161
|
+
raise ValueError("Invalid CurveZMQ key format") from e
|
162
|
+
sock.setsockopt(zmq.CURVE_SERVER, True) # Must come before bind
|
163
|
+
return sock
|
164
|
+
|
165
|
+
def term(self):
|
166
|
+
if self.auth_thread:
|
167
|
+
self.auth_thread.stop()
|
168
|
+
super().term()
|
169
|
+
|
170
|
+
def destroy(self, linger: Optional[int] = None):
|
171
|
+
if self.auth_thread:
|
172
|
+
self.auth_thread.stop()
|
173
|
+
super().destroy(linger)
|
174
|
+
|
175
|
+
def recreate(self, linger: Optional[int] = None):
|
176
|
+
super().recreate(linger)
|
177
|
+
if self.auth_thread:
|
178
|
+
self.auth_thread = self._start_auth_thread()
|
179
|
+
|
180
|
+
|
181
|
+
class ClientContext(BaseContext):
|
182
|
+
"""CurveZMQ client context
|
183
|
+
|
184
|
+
We create client sockets via the `ctx.socket` method, which automatically
|
185
|
+
applies the necessary certificates and socket options.
|
186
|
+
|
187
|
+
Parameters
|
188
|
+
----------
|
189
|
+
cert_dir : str | os.PathLike | None
|
190
|
+
Path to the certificate directory. Setting this to None will disable encryption.
|
191
|
+
"""
|
192
|
+
|
193
|
+
def socket(self, socket_type: int, *args, **kwargs) -> zmq.Socket:
|
194
|
+
sock = self._ctx.socket(socket_type, *args, **kwargs)
|
195
|
+
if self.encrypted:
|
196
|
+
assert self.cert_dir # For mypy
|
197
|
+
public_key, secret_key = _load_certificate(self.cert_dir, name="client")
|
198
|
+
server_public_key, _ = _load_certificate(self.cert_dir, name="server")
|
199
|
+
try:
|
200
|
+
sock.setsockopt(zmq.CURVE_PUBLICKEY, public_key)
|
201
|
+
sock.setsockopt(zmq.CURVE_SECRETKEY, secret_key)
|
202
|
+
sock.setsockopt(zmq.CURVE_SERVERKEY, server_public_key)
|
203
|
+
except zmq.ZMQError as e:
|
204
|
+
raise ValueError("Invalid CurveZMQ key format") from e
|
205
|
+
return sock
|
@@ -302,7 +302,7 @@ class DataFlowKernel:
|
|
302
302
|
res = self._unwrap_remote_exception_wrapper(future)
|
303
303
|
|
304
304
|
except Exception as e:
|
305
|
-
logger.
|
305
|
+
logger.info(f"Task {task_id} try {task_record['try_id']} failed with exception of type {type(e).__name__}")
|
306
306
|
# We keep the history separately, since the future itself could be
|
307
307
|
# tossed.
|
308
308
|
task_record['fail_history'].append(repr(e))
|
@@ -22,6 +22,7 @@ from parsl.executors.errors import (
|
|
22
22
|
UnsupportedFeatureError
|
23
23
|
)
|
24
24
|
|
25
|
+
from parsl import curvezmq
|
25
26
|
from parsl.executors.status_handling import BlockProviderExecutor
|
26
27
|
from parsl.providers.base import ExecutionProvider
|
27
28
|
from parsl.data_provider.staging import Staging
|
@@ -174,6 +175,9 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin):
|
|
174
175
|
|
175
176
|
worker_logdir_root : string
|
176
177
|
In case of a remote file system, specify the path to where logs will be kept.
|
178
|
+
|
179
|
+
encrypted : bool
|
180
|
+
Flag to enable/disable encryption (CurveZMQ). Default is False.
|
177
181
|
"""
|
178
182
|
|
179
183
|
@typeguard.typechecked
|
@@ -199,7 +203,8 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin):
|
|
199
203
|
poll_period: int = 10,
|
200
204
|
address_probe_timeout: Optional[int] = None,
|
201
205
|
worker_logdir_root: Optional[str] = None,
|
202
|
-
block_error_handler: Union[bool, Callable[[BlockProviderExecutor, Dict[str, JobStatus]], None]] = True
|
206
|
+
block_error_handler: Union[bool, Callable[[BlockProviderExecutor, Dict[str, JobStatus]], None]] = True,
|
207
|
+
encrypted: bool = False):
|
203
208
|
|
204
209
|
logger.debug("Initializing HighThroughputExecutor")
|
205
210
|
|
@@ -256,6 +261,8 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin):
|
|
256
261
|
self.run_dir = '.'
|
257
262
|
self.worker_logdir_root = worker_logdir_root
|
258
263
|
self.cpu_affinity = cpu_affinity
|
264
|
+
self.encrypted = encrypted
|
265
|
+
self.cert_dir = None
|
259
266
|
|
260
267
|
if not launch_cmd:
|
261
268
|
launch_cmd = (
|
@@ -267,6 +274,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin):
|
|
267
274
|
"--poll {poll_period} "
|
268
275
|
"--task_port={task_port} "
|
269
276
|
"--result_port={result_port} "
|
277
|
+
"--cert_dir {cert_dir} "
|
270
278
|
"--logdir={logdir} "
|
271
279
|
"--block_id={{block_id}} "
|
272
280
|
"--hb_period={heartbeat_period} "
|
@@ -280,6 +288,16 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin):
|
|
280
288
|
|
281
289
|
radio_mode = "htex"
|
282
290
|
|
291
|
+
@property
|
292
|
+
def logdir(self):
|
293
|
+
return "{}/{}".format(self.run_dir, self.label)
|
294
|
+
|
295
|
+
@property
|
296
|
+
def worker_logdir(self):
|
297
|
+
if self.worker_logdir_root is not None:
|
298
|
+
return "{}/{}".format(self.worker_logdir_root, self.label)
|
299
|
+
return self.logdir
|
300
|
+
|
283
301
|
def initialize_scaling(self):
|
284
302
|
"""Compose the launch command and scale out the initial blocks.
|
285
303
|
"""
|
@@ -289,9 +307,6 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin):
|
|
289
307
|
address_probe_timeout_string = ""
|
290
308
|
if self.address_probe_timeout:
|
291
309
|
address_probe_timeout_string = "--address_probe_timeout={}".format(self.address_probe_timeout)
|
292
|
-
worker_logdir = "{}/{}".format(self.run_dir, self.label)
|
293
|
-
if self.worker_logdir_root is not None:
|
294
|
-
worker_logdir = "{}/{}".format(self.worker_logdir_root, self.label)
|
295
310
|
|
296
311
|
l_cmd = self.launch_cmd.format(debug=debug_opts,
|
297
312
|
prefetch_capacity=self.prefetch_capacity,
|
@@ -306,7 +321,8 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin):
|
|
306
321
|
heartbeat_period=self.heartbeat_period,
|
307
322
|
heartbeat_threshold=self.heartbeat_threshold,
|
308
323
|
poll_period=self.poll_period,
|
309
|
-
|
324
|
+
cert_dir=self.cert_dir,
|
325
|
+
logdir=self.worker_logdir,
|
310
326
|
cpu_affinity=self.cpu_affinity,
|
311
327
|
accelerators=" ".join(self.available_accelerators))
|
312
328
|
self.launch_cmd = l_cmd
|
@@ -327,9 +343,25 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin):
|
|
327
343
|
def start(self):
|
328
344
|
"""Create the Interchange process and connect to it.
|
329
345
|
"""
|
330
|
-
self.
|
331
|
-
|
332
|
-
|
346
|
+
if self.encrypted and self.cert_dir is None:
|
347
|
+
logger.debug("Creating CurveZMQ certificates")
|
348
|
+
self.cert_dir = curvezmq.create_certificates(self.logdir)
|
349
|
+
elif not self.encrypted and self.cert_dir:
|
350
|
+
raise AttributeError(
|
351
|
+
"The certificates directory path attribute (cert_dir) is defined, but the "
|
352
|
+
"encrypted attribute is set to False. You must either change cert_dir to "
|
353
|
+
"None or encrypted to True."
|
354
|
+
)
|
355
|
+
|
356
|
+
self.outgoing_q = zmq_pipes.TasksOutgoing(
|
357
|
+
curvezmq.ClientContext(self.cert_dir), "127.0.0.1", self.interchange_port_range
|
358
|
+
)
|
359
|
+
self.incoming_q = zmq_pipes.ResultsIncoming(
|
360
|
+
curvezmq.ClientContext(self.cert_dir), "127.0.0.1", self.interchange_port_range
|
361
|
+
)
|
362
|
+
self.command_client = zmq_pipes.CommandClient(
|
363
|
+
curvezmq.ClientContext(self.cert_dir), "127.0.0.1", self.interchange_port_range
|
364
|
+
)
|
333
365
|
|
334
366
|
self._queue_management_thread = None
|
335
367
|
self._start_queue_management_thread()
|
@@ -450,10 +482,11 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin):
|
|
450
482
|
"worker_port_range": self.worker_port_range,
|
451
483
|
"hub_address": self.hub_address,
|
452
484
|
"hub_port": self.hub_port,
|
453
|
-
"logdir":
|
485
|
+
"logdir": self.logdir,
|
454
486
|
"heartbeat_threshold": self.heartbeat_threshold,
|
455
487
|
"poll_period": self.poll_period,
|
456
|
-
"logging_level": logging.DEBUG if self.worker_debug else logging.INFO
|
488
|
+
"logging_level": logging.DEBUG if self.worker_debug else logging.INFO,
|
489
|
+
"cert_dir": self.cert_dir,
|
457
490
|
},
|
458
491
|
daemon=True,
|
459
492
|
name="HTEX-Interchange"
|
@@ -603,7 +636,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin):
|
|
603
636
|
def workers_per_node(self) -> Union[int, float]:
|
604
637
|
return self._workers_per_node
|
605
638
|
|
606
|
-
def scale_in(self, blocks
|
639
|
+
def scale_in(self, blocks, force=True, max_idletime=None):
|
607
640
|
"""Scale in the number of active blocks by specified amount.
|
608
641
|
|
609
642
|
The scale in method here is very rude. It doesn't give the workers
|
@@ -618,55 +651,51 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin):
|
|
618
651
|
|
619
652
|
force : Bool
|
620
653
|
Used along with blocks to indicate whether blocks should be terminated by force.
|
654
|
+
|
621
655
|
When force = True, we will kill blocks regardless of the blocks being busy
|
622
|
-
|
623
|
-
|
624
|
-
|
656
|
+
|
657
|
+
When force = False, only idle blocks will be terminated. If the
|
658
|
+
number of idle blocks < ``blocks``, then fewer than ``blocks``
|
659
|
+
blocks will be terminated.
|
625
660
|
|
626
661
|
max_idletime: float
|
627
662
|
A time to indicate how long a block can be idle.
|
628
663
|
Used along with force = False to kill blocks that have been idle for that long.
|
629
664
|
|
630
|
-
block_ids : list
|
631
|
-
List of specific block ids to terminate. Optional
|
632
|
-
|
633
665
|
Returns
|
634
666
|
-------
|
635
|
-
List of
|
667
|
+
List of block IDs scaled in
|
636
668
|
"""
|
637
|
-
logger.debug(f"Scale in called, blocks={blocks}
|
638
|
-
|
639
|
-
|
669
|
+
logger.debug(f"Scale in called, blocks={blocks}")
|
670
|
+
managers = self.connected_managers()
|
671
|
+
block_info = {} # block id -> list( tasks, idle duration )
|
672
|
+
for manager in managers:
|
673
|
+
if not manager['active']:
|
674
|
+
continue
|
675
|
+
b_id = manager['block_id']
|
676
|
+
if b_id not in block_info:
|
677
|
+
block_info[b_id] = [0, float('inf')]
|
678
|
+
block_info[b_id][0] += manager['tasks']
|
679
|
+
block_info[b_id][1] = min(block_info[b_id][1], manager['idle_duration'])
|
680
|
+
|
681
|
+
sorted_blocks = sorted(block_info.items(), key=lambda item: (item[1][1], item[1][0]))
|
682
|
+
logger.debug(f"Scale in selecting from {len(sorted_blocks)} blocks")
|
683
|
+
if force is True:
|
684
|
+
block_ids_to_kill = [x[0] for x in sorted_blocks[:blocks]]
|
640
685
|
else:
|
641
|
-
|
642
|
-
|
643
|
-
for manager in managers:
|
644
|
-
if not manager['active']:
|
645
|
-
continue
|
646
|
-
b_id = manager['block_id']
|
647
|
-
if b_id not in block_info:
|
648
|
-
block_info[b_id] = [0, float('inf')]
|
649
|
-
block_info[b_id][0] += manager['tasks']
|
650
|
-
block_info[b_id][1] = min(block_info[b_id][1], manager['idle_duration'])
|
651
|
-
|
652
|
-
sorted_blocks = sorted(block_info.items(), key=lambda item: (item[1][1], item[1][0]))
|
653
|
-
logger.debug(f"Scale in selecting from {len(sorted_blocks)} blocks")
|
654
|
-
if force is True:
|
655
|
-
block_ids_to_kill = [x[0] for x in sorted_blocks[:blocks]]
|
686
|
+
if not max_idletime:
|
687
|
+
block_ids_to_kill = [x[0] for x in sorted_blocks if x[1][0] == 0][:blocks]
|
656
688
|
else:
|
657
|
-
|
658
|
-
|
659
|
-
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
|
666
|
-
logger.
|
667
|
-
block_ids_to_kill))
|
668
|
-
if len(block_ids_to_kill) < blocks:
|
669
|
-
logger.warning(f"Could not find enough blocks to kill: wanted {blocks} but only selected {len(block_ids_to_kill)}")
|
689
|
+
block_ids_to_kill = []
|
690
|
+
for x in sorted_blocks:
|
691
|
+
if x[1][1] > max_idletime and x[1][0] == 0:
|
692
|
+
block_ids_to_kill.append(x[0])
|
693
|
+
if len(block_ids_to_kill) == blocks:
|
694
|
+
break
|
695
|
+
logger.debug("Selected idle block ids to kill: {}".format(
|
696
|
+
block_ids_to_kill))
|
697
|
+
if len(block_ids_to_kill) < blocks:
|
698
|
+
logger.warning(f"Could not find enough blocks to kill: wanted {blocks} but only selected {len(block_ids_to_kill)}")
|
670
699
|
|
671
700
|
# Hold the block
|
672
701
|
for block_id in block_ids_to_kill:
|
@@ -16,6 +16,7 @@ import json
|
|
16
16
|
|
17
17
|
from typing import cast, Any, Dict, NoReturn, Sequence, Set, Optional, Tuple
|
18
18
|
|
19
|
+
from parsl import curvezmq
|
19
20
|
from parsl.utils import setproctitle
|
20
21
|
from parsl.version import VERSION as PARSL_VERSION
|
21
22
|
from parsl.serialize import serialize as serialize_object
|
@@ -79,6 +80,7 @@ class Interchange:
|
|
79
80
|
logdir: str = ".",
|
80
81
|
logging_level: int = logging.INFO,
|
81
82
|
poll_period: int = 10,
|
83
|
+
cert_dir: Optional[str] = None,
|
82
84
|
) -> None:
|
83
85
|
"""
|
84
86
|
Parameters
|
@@ -120,7 +122,10 @@ class Interchange:
|
|
120
122
|
poll_period : int
|
121
123
|
The main thread polling period, in milliseconds. Default: 10ms
|
122
124
|
|
125
|
+
cert_dir : str | None
|
126
|
+
Path to the certificate directory. Default: None
|
123
127
|
"""
|
128
|
+
self.cert_dir = cert_dir
|
124
129
|
self.logdir = logdir
|
125
130
|
os.makedirs(self.logdir, exist_ok=True)
|
126
131
|
|
@@ -134,15 +139,15 @@ class Interchange:
|
|
134
139
|
|
135
140
|
logger.info("Attempting connection to client at {} on ports: {},{},{}".format(
|
136
141
|
client_address, client_ports[0], client_ports[1], client_ports[2]))
|
137
|
-
self.
|
138
|
-
self.task_incoming = self.
|
142
|
+
self.zmq_context = curvezmq.ServerContext(self.cert_dir)
|
143
|
+
self.task_incoming = self.zmq_context.socket(zmq.DEALER)
|
139
144
|
self.task_incoming.set_hwm(0)
|
140
145
|
self.task_incoming.connect("tcp://{}:{}".format(client_address, client_ports[0]))
|
141
|
-
self.results_outgoing = self.
|
146
|
+
self.results_outgoing = self.zmq_context.socket(zmq.DEALER)
|
142
147
|
self.results_outgoing.set_hwm(0)
|
143
148
|
self.results_outgoing.connect("tcp://{}:{}".format(client_address, client_ports[1]))
|
144
149
|
|
145
|
-
self.command_channel = self.
|
150
|
+
self.command_channel = self.zmq_context.socket(zmq.REP)
|
146
151
|
self.command_channel.connect("tcp://{}:{}".format(client_address, client_ports[2]))
|
147
152
|
logger.info("Connected to client")
|
148
153
|
|
@@ -155,9 +160,9 @@ class Interchange:
|
|
155
160
|
self.worker_ports = worker_ports
|
156
161
|
self.worker_port_range = worker_port_range
|
157
162
|
|
158
|
-
self.task_outgoing = self.
|
163
|
+
self.task_outgoing = self.zmq_context.socket(zmq.ROUTER)
|
159
164
|
self.task_outgoing.set_hwm(0)
|
160
|
-
self.results_incoming = self.
|
165
|
+
self.results_incoming = self.zmq_context.socket(zmq.ROUTER)
|
161
166
|
self.results_incoming.set_hwm(0)
|
162
167
|
|
163
168
|
if self.worker_ports:
|
@@ -241,7 +246,8 @@ class Interchange:
|
|
241
246
|
def _create_monitoring_channel(self) -> Optional[zmq.Socket]:
|
242
247
|
if self.hub_address and self.hub_port:
|
243
248
|
logger.info("Connecting to monitoring")
|
244
|
-
|
249
|
+
# This is a one-off because monitoring is unencrypted
|
250
|
+
hub_channel = zmq.Context().socket(zmq.DEALER)
|
245
251
|
hub_channel.set_hwm(0)
|
246
252
|
hub_channel.connect("tcp://{}:{}".format(self.hub_address, self.hub_port))
|
247
253
|
logger.info("Monitoring enabled and connected to hub")
|
@@ -379,6 +385,7 @@ class Interchange:
|
|
379
385
|
self.expire_bad_managers(interesting_managers, hub_channel)
|
380
386
|
self.process_tasks_to_send(interesting_managers)
|
381
387
|
|
388
|
+
self.zmq_context.destroy()
|
382
389
|
delta = time.time() - start
|
383
390
|
logger.info("Processed {} tasks in {} seconds".format(self.count, delta))
|
384
391
|
logger.warning("Exiting")
|
@@ -20,8 +20,8 @@ import multiprocessing
|
|
20
20
|
from multiprocessing.managers import DictProxy
|
21
21
|
from multiprocessing.sharedctypes import Synchronized
|
22
22
|
|
23
|
+
from parsl import curvezmq
|
23
24
|
from parsl.process_loggers import wrap_with_logs
|
24
|
-
|
25
25
|
from parsl.version import VERSION as PARSL_VERSION
|
26
26
|
from parsl.app.errors import RemoteExceptionWrapper
|
27
27
|
from parsl.executors.high_throughput.errors import WorkerLost
|
@@ -63,7 +63,8 @@ class Manager:
|
|
63
63
|
heartbeat_period,
|
64
64
|
poll_period,
|
65
65
|
cpu_affinity,
|
66
|
-
available_accelerators: Sequence[str]
|
66
|
+
available_accelerators: Sequence[str],
|
67
|
+
cert_dir: Optional[str]):
|
67
68
|
"""
|
68
69
|
Parameters
|
69
70
|
----------
|
@@ -118,6 +119,8 @@ class Manager:
|
|
118
119
|
available_accelerators: list of str
|
119
120
|
List of accelerators available to the workers.
|
120
121
|
|
122
|
+
cert_dir : str | None
|
123
|
+
Path to the certificate directory.
|
121
124
|
"""
|
122
125
|
|
123
126
|
logger.info("Manager started")
|
@@ -137,15 +140,16 @@ class Manager:
|
|
137
140
|
print("Failed to find a viable address to connect to interchange. Exiting")
|
138
141
|
exit(5)
|
139
142
|
|
140
|
-
self.
|
141
|
-
self.
|
143
|
+
self.cert_dir = cert_dir
|
144
|
+
self.zmq_context = curvezmq.ClientContext(self.cert_dir)
|
145
|
+
self.task_incoming = self.zmq_context.socket(zmq.DEALER)
|
142
146
|
self.task_incoming.setsockopt(zmq.IDENTITY, uid.encode('utf-8'))
|
143
147
|
# Linger is set to 0, so that the manager can exit even when there might be
|
144
148
|
# messages in the pipe
|
145
149
|
self.task_incoming.setsockopt(zmq.LINGER, 0)
|
146
150
|
self.task_incoming.connect(task_q_url)
|
147
151
|
|
148
|
-
self.result_outgoing = self.
|
152
|
+
self.result_outgoing = self.zmq_context.socket(zmq.DEALER)
|
149
153
|
self.result_outgoing.setsockopt(zmq.IDENTITY, uid.encode('utf-8'))
|
150
154
|
self.result_outgoing.setsockopt(zmq.LINGER, 0)
|
151
155
|
self.result_outgoing.connect(result_q_url)
|
@@ -468,7 +472,7 @@ class Manager:
|
|
468
472
|
|
469
473
|
self.task_incoming.close()
|
470
474
|
self.result_outgoing.close()
|
471
|
-
self.
|
475
|
+
self.zmq_context.term()
|
472
476
|
delta = time.time() - start
|
473
477
|
logger.info("process_worker_pool ran for {} seconds".format(delta))
|
474
478
|
return
|
@@ -720,6 +724,8 @@ if __name__ == "__main__":
|
|
720
724
|
help="Enable logging at DEBUG level")
|
721
725
|
parser.add_argument("-a", "--addresses", default='',
|
722
726
|
help="Comma separated list of addresses at which the interchange could be reached")
|
727
|
+
parser.add_argument("--cert_dir", required=True,
|
728
|
+
help="Path to certificate directory.")
|
723
729
|
parser.add_argument("-l", "--logdir", default="process_worker_pool_logs",
|
724
730
|
help="Process worker pool log directory")
|
725
731
|
parser.add_argument("-u", "--uid", default=str(uuid.uuid4()).split('-')[-1],
|
@@ -773,6 +779,7 @@ if __name__ == "__main__":
|
|
773
779
|
|
774
780
|
logger.info("Python version: {}".format(sys.version))
|
775
781
|
logger.info("Debug logging: {}".format(args.debug))
|
782
|
+
logger.info("Certificates dir: {}".format(args.cert_dir))
|
776
783
|
logger.info("Log dir: {}".format(args.logdir))
|
777
784
|
logger.info("Manager ID: {}".format(args.uid))
|
778
785
|
logger.info("Block ID: {}".format(args.block_id))
|
@@ -804,7 +811,8 @@ if __name__ == "__main__":
|
|
804
811
|
heartbeat_period=int(args.hb_period),
|
805
812
|
poll_period=int(args.poll),
|
806
813
|
cpu_affinity=args.cpu_affinity,
|
807
|
-
available_accelerators=args.available_accelerators
|
814
|
+
available_accelerators=args.available_accelerators,
|
815
|
+
cert_dir=None if args.cert_dir == "None" else args.cert_dir)
|
808
816
|
manager.start()
|
809
817
|
|
810
818
|
except Exception:
|