parsl 2023.10.16__tar.gz → 2023.11.13__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-2023.10.16/parsl.egg-info → parsl-2023.11.13}/PKG-INFO +3 -2
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/app/app.py +29 -21
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/channels/base.py +12 -24
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/config.py +19 -12
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/ad_hoc.py +2 -2
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/dataflow/dflow.py +56 -49
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/dataflow/futures.py +39 -9
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/dataflow/taskrecord.py +7 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/base.py +1 -1
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/high_throughput/executor.py +2 -2
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/high_throughput/interchange.py +59 -53
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/high_throughput/process_worker_pool.py +2 -2
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/high_throughput/zmq_pipes.py +1 -1
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/status_handling.py +1 -1
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/taskvine/exec_parsl_function.py +3 -4
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/taskvine/executor.py +18 -4
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/taskvine/factory.py +1 -1
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/taskvine/manager.py +12 -16
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/taskvine/utils.py +5 -5
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/threads.py +1 -2
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/workqueue/errors.py +4 -2
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/workqueue/exec_parsl_function.py +2 -1
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/workqueue/executor.py +38 -22
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/workqueue/parsl_coprocess.py +0 -1
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/monitoring.py +6 -6
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/remote.py +1 -1
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/plots/default/workflow_plots.py +4 -4
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +2 -2
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/slurm/slurm.py +1 -1
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/ad_hoc_cluster_htex.py +3 -3
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/htex_ad_hoc_cluster.py +1 -1
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/local_threads_monitoring.py +1 -1
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/conftest.py +6 -2
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/scaling_tests/vineex_condor.py +1 -1
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/scaling_tests/vineex_local.py +1 -1
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/scaling_tests/wqex_condor.py +1 -1
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/scaling_tests/wqex_local.py +1 -1
- parsl-2023.11.13/parsl/tests/test_docs/test_kwargs.py +37 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_error_handling/test_python_walltime.py +2 -2
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_monitoring/test_memoization_representation.py +5 -5
- parsl-2023.11.13/parsl/tests/test_python_apps/test_lifted.py +138 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/utils.py +4 -4
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/version.py +1 -1
- {parsl-2023.10.16 → parsl-2023.11.13/parsl.egg-info}/PKG-INFO +3 -2
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl.egg-info/SOURCES.txt +2 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl.egg-info/requires.txt +8 -6
- {parsl-2023.10.16 → parsl-2023.11.13}/setup.py +3 -1
- {parsl-2023.10.16 → parsl-2023.11.13}/LICENSE +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/MANIFEST.in +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/README.rst +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/addresses.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/app/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/app/bash.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/app/errors.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/app/futures.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/app/python.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/benchmark/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/benchmark/perf.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/channels/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/channels/errors.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/channels/local/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/channels/local/local.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/channels/oauth_ssh/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/channels/oauth_ssh/oauth_ssh.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/channels/ssh/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/channels/ssh/ssh.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/channels/ssh_il/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/channels/ssh_il/ssh_il.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/concurrent/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/ASPIRE1.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/Azure.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/bluewaters.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/bridges.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/cc_in2p3.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/comet.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/cooley.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/ec2.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/frontera.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/htex_local.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/illinoiscluster.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/kubernetes.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/local_threads.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/midway.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/osg.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/polaris.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/stampede2.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/summit.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/theta.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/toss3_llnl.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/vineex_local.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/wqex_local.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/data_provider/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/data_provider/data_manager.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/data_provider/file_noop.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/data_provider/files.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/data_provider/ftp.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/data_provider/globus.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/data_provider/http.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/data_provider/rsync.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/data_provider/staging.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/dataflow/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/dataflow/errors.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/dataflow/memoization.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/dataflow/rundirs.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/dataflow/states.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/errors.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/errors.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/flux/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/flux/execute_parsl_task.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/flux/executor.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/flux/flux_instance_manager.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/high_throughput/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/high_throughput/errors.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/high_throughput/manager_record.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/high_throughput/monitoring_info.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/high_throughput/probe.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/taskvine/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/taskvine/errors.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/taskvine/factory_config.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/taskvine/manager_config.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/workqueue/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/jobs/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/jobs/error_handlers.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/jobs/errors.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/jobs/job_status_poller.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/jobs/states.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/jobs/strategy.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/launchers/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/launchers/base.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/launchers/errors.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/launchers/launchers.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/log_utils.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/db_manager.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/message_type.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/queries/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/queries/pandas.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/radios.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/types.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/app.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/models.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/plots/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/templates/app.html +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/templates/dag.html +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/templates/error.html +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/templates/layout.html +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/templates/task.html +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/templates/workflow.html +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/utils.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/version.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/views.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/multiprocessing.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/process_loggers.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/ad_hoc/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/ad_hoc/ad_hoc.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/aws/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/aws/aws.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/aws/template.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/azure/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/azure/azure.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/azure/template.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/base.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/cluster_provider.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/cobalt/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/cobalt/cobalt.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/cobalt/template.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/condor/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/condor/condor.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/condor/template.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/errors.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/googlecloud/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/googlecloud/googlecloud.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/grid_engine/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/grid_engine/grid_engine.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/grid_engine/template.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/kubernetes/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/kubernetes/kube.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/kubernetes/template.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/local/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/local/local.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/lsf/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/lsf/lsf.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/lsf/template.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/pbspro/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/pbspro/pbspro.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/pbspro/template.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/slurm/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/slurm/template.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/torque/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/torque/template.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/torque/torque.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/py.typed +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/serialize/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/serialize/base.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/serialize/concretes.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/serialize/errors.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/serialize/facade.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/serialize/proxystore.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/callables_helper.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/azure_single_node.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/bluewaters.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/bridges.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/cc_in2p3.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/comet.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/cooley_htex.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/ec2_single_node.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/ec2_spot.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/frontera.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/htex_local.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/htex_local_alternate.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/htex_local_intask_staging.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/htex_local_rsync_staging.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/local_adhoc.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/local_threads.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/local_threads_checkpoint_periodic.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/local_threads_globus.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/local_threads_no_cache.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/midway.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/nscc_singapore.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/osg_htex.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/petrelkube.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/summit.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/swan_htex.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/taskvine_ex.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/theta.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/user_opts.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/workqueue_ex.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/integration/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/integration/latency.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/integration/test_apps/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/integration/test_channels/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/integration/test_channels/test_channels.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/integration/test_channels/test_local_channel.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/integration/test_channels/test_scp_1.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/integration/test_channels/test_ssh_1.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/integration/test_channels/test_ssh_errors.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/integration/test_channels/test_ssh_file_transport.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/integration/test_channels/test_ssh_interactive.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/integration/test_stress/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/manual_tests/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/manual_tests/htex_local.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/manual_tests/test_ad_hoc_htex.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/manual_tests/test_basic.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/manual_tests/test_fan_in_out_htex_remote.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/manual_tests/test_log_filter.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/manual_tests/test_memory_limits.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/manual_tests/test_oauth_ssh.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/manual_tests/test_regression_220.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/manual_tests/test_udp_simple.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/manual_tests/test_worker_count.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/scaling_tests/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/scaling_tests/htex_local.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/scaling_tests/local_threads.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/scaling_tests/test_scale.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/site_tests/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/site_tests/site_config_selector.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/site_tests/test_provider.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/site_tests/test_site.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/sites/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/sites/test_affinity.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/sites/test_concurrent.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/sites/test_dynamic_executor.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/sites/test_ec2.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/sites/test_launchers.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/sites/test_local_adhoc.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/sites/test_mpi/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/sites/test_start_method.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/sites/test_worker_info.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_aalst_patterns.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_bash_apps/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_bash_apps/test_basic.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_bash_apps/test_memoize.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_bash_apps/test_multiline.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_bash_apps/test_pipeline.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_bash_apps/test_stdout.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_callables.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_channels/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_channels/test_large_output.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_checkpointing/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_checkpointing/test_periodic.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_checkpointing/test_python_checkpoint_3.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_checkpointing/test_regression_233.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_checkpointing/test_task_exit.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_data/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_data/test_file.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_data/test_file_apps.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_data/test_file_staging.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_data/test_output_chain_filenames.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_docs/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_docs/test_from_slides.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_docs/test_workflow1.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_docs/test_workflow2.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_docs/test_workflow4.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_error_handling/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_error_handling/test_fail.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_error_handling/test_htex_basic.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_error_handling/test_htex_missing_worker.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_error_handling/test_htex_worker_failure.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_error_handling/test_rand_fail.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_error_handling/test_resource_spec.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_error_handling/test_retries.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_flowcontrol/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_flux.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_htex/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_htex/test_htex_zmq_binding.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_monitoring/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_monitoring/test_basic.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_monitoring/test_fuzz_zmq.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_providers/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_providers/test_local_provider.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_basic.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_dep_standard_futures.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_depfail_propagation.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_fail.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_futures.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_garbage_collect.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_join.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_mapred.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_memoize_2.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_outputs.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_overview.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_pipeline.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_simple.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_timeout.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_type5.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_regression/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_regression/test_1480.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_regression/test_1653.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_regression/test_221.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_regression/test_226.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_regression/test_2652.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_regression/test_69a.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_regression/test_854.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_regression/test_97_parallelism_0.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_regression/test_98.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_scaling/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_scaling/test_block_error_handler.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_scaling/test_regression_1621.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_scaling/test_scale_down.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_serialization/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_serialization/test_2555_caching_deserializer.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_serialization/test_basic.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_serialization/test_proxystore_configured.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_serialization/test_proxystore_impl.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_staging/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_staging/staging_provider.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_staging/test_1316.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_staging/test_docs_1.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_staging/test_docs_2.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_staging/test_staging_globus.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_staging/test_staging_https.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_staging/test_staging_https_in_task.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_summary.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_thread_parallelism.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_threads/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_threads/test_configs.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/utils.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/usage_tracking/__init__.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl/usage_tracking/usage.py +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl.egg-info/dependency_links.txt +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl.egg-info/entry_points.txt +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/parsl.egg-info/top_level.txt +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/requirements.txt +0 -0
- {parsl-2023.10.16 → parsl-2023.11.13}/setup.cfg +0 -0
@@ -1,9 +1,9 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: parsl
|
3
|
-
Version: 2023.
|
3
|
+
Version: 2023.11.13
|
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/2023.
|
6
|
+
Download-URL: https://github.com/Parsl/parsl/archive/2023.11.13.tar.gz
|
7
7
|
Author: The Parsl Team
|
8
8
|
Author-email: parsl@googlegroups.com
|
9
9
|
License: Apache 2.0
|
@@ -17,6 +17,7 @@ Classifier: Programming Language :: Python :: 3.10
|
|
17
17
|
Classifier: Programming Language :: Python :: 3.11
|
18
18
|
Requires-Python: >=3.8.0
|
19
19
|
Provides-Extra: monitoring
|
20
|
+
Provides-Extra: visualization
|
20
21
|
Provides-Extra: aws
|
21
22
|
Provides-Extra: kubernetes
|
22
23
|
Provides-Extra: oauth_ssh
|
@@ -6,11 +6,16 @@ import logging
|
|
6
6
|
import typeguard
|
7
7
|
from abc import ABCMeta, abstractmethod
|
8
8
|
from inspect import signature
|
9
|
-
from typing import List, Optional, Union
|
9
|
+
from typing import List, Optional, Sequence, Union
|
10
10
|
from typing_extensions import Literal
|
11
11
|
|
12
12
|
from parsl.dataflow.dflow import DataFlowKernel
|
13
13
|
|
14
|
+
from typing import Any, Callable, Dict
|
15
|
+
|
16
|
+
from parsl.dataflow.futures import AppFuture
|
17
|
+
|
18
|
+
|
14
19
|
logger = logging.getLogger(__name__)
|
15
20
|
|
16
21
|
|
@@ -22,7 +27,12 @@ class AppBase(metaclass=ABCMeta):
|
|
22
27
|
|
23
28
|
"""
|
24
29
|
|
25
|
-
|
30
|
+
@typeguard.typechecked
|
31
|
+
def __init__(self, func: Callable,
|
32
|
+
data_flow_kernel: Optional[DataFlowKernel] = None,
|
33
|
+
executors: Union[List[str], Literal['all']] = 'all',
|
34
|
+
cache: bool = False,
|
35
|
+
ignore_for_cache: Optional[Sequence[str]] = None) -> None:
|
26
36
|
"""Construct the App object.
|
27
37
|
|
28
38
|
Args:
|
@@ -34,7 +44,7 @@ class AppBase(metaclass=ABCMeta):
|
|
34
44
|
after calling :meth:`parsl.dataflow.dflow.DataFlowKernelLoader.load`.
|
35
45
|
- executors (str|list) : Labels of the executors that this app can execute over. Default is 'all'.
|
36
46
|
- cache (Bool) : Enable caching of this app ?
|
37
|
-
- ignore_for_cache (
|
47
|
+
- ignore_for_cache (sequence|None): Names of arguments which will be ignored by the caching mechanism.
|
38
48
|
|
39
49
|
Returns:
|
40
50
|
- App object.
|
@@ -46,12 +56,10 @@ class AppBase(metaclass=ABCMeta):
|
|
46
56
|
self.executors = executors
|
47
57
|
self.cache = cache
|
48
58
|
self.ignore_for_cache = ignore_for_cache
|
49
|
-
if not (isinstance(executors, list) or isinstance(executors, str)):
|
50
|
-
logger.error("App {} specifies invalid executor option, expects string or list".format(
|
51
|
-
func.__name__))
|
52
59
|
|
53
60
|
params = signature(func).parameters
|
54
61
|
|
62
|
+
self.kwargs: Dict[str, Any]
|
55
63
|
self.kwargs = {}
|
56
64
|
if 'stdout' in params:
|
57
65
|
self.kwargs['stdout'] = params['stdout'].default
|
@@ -65,16 +73,16 @@ class AppBase(metaclass=ABCMeta):
|
|
65
73
|
self.inputs = params['inputs'].default if 'inputs' in params else []
|
66
74
|
|
67
75
|
@abstractmethod
|
68
|
-
def __call__(self, *args, **kwargs):
|
76
|
+
def __call__(self, *args: Any, **kwargs: Any) -> AppFuture:
|
69
77
|
pass
|
70
78
|
|
71
79
|
|
72
80
|
@typeguard.typechecked
|
73
|
-
def python_app(function=None,
|
81
|
+
def python_app(function: Optional[Callable] = None,
|
74
82
|
data_flow_kernel: Optional[DataFlowKernel] = None,
|
75
83
|
cache: bool = False,
|
76
84
|
executors: Union[List[str], Literal['all']] = 'all',
|
77
|
-
ignore_for_cache: Optional[
|
85
|
+
ignore_for_cache: Optional[Sequence[str]] = None) -> Callable:
|
78
86
|
"""Decorator function for making python apps.
|
79
87
|
|
80
88
|
Parameters
|
@@ -91,13 +99,13 @@ def python_app(function=None,
|
|
91
99
|
Labels of the executors that this app can execute over. Default is 'all'.
|
92
100
|
cache : bool
|
93
101
|
Enable caching of the app call. Default is False.
|
94
|
-
ignore_for_cache : (
|
102
|
+
ignore_for_cache : (sequence|None)
|
95
103
|
Names of arguments which will be ignored by the caching mechanism.
|
96
104
|
"""
|
97
105
|
from parsl.app.python import PythonApp
|
98
106
|
|
99
|
-
def decorator(func):
|
100
|
-
def wrapper(f):
|
107
|
+
def decorator(func: Callable) -> Callable:
|
108
|
+
def wrapper(f: Callable) -> PythonApp:
|
101
109
|
return PythonApp(f,
|
102
110
|
data_flow_kernel=data_flow_kernel,
|
103
111
|
cache=cache,
|
@@ -111,10 +119,10 @@ def python_app(function=None,
|
|
111
119
|
|
112
120
|
|
113
121
|
@typeguard.typechecked
|
114
|
-
def join_app(function=None,
|
122
|
+
def join_app(function: Optional[Callable] = None,
|
115
123
|
data_flow_kernel: Optional[DataFlowKernel] = None,
|
116
124
|
cache: bool = False,
|
117
|
-
ignore_for_cache: Optional[
|
125
|
+
ignore_for_cache: Optional[Sequence[str]] = None) -> Callable:
|
118
126
|
"""Decorator function for making join apps
|
119
127
|
|
120
128
|
Parameters
|
@@ -129,13 +137,13 @@ def join_app(function=None,
|
|
129
137
|
be omitted only after calling :meth:`parsl.dataflow.dflow.DataFlowKernelLoader.load`. Default is None.
|
130
138
|
cache : bool
|
131
139
|
Enable caching of the app call. Default is False.
|
132
|
-
ignore_for_cache : (
|
140
|
+
ignore_for_cache : (sequence|None)
|
133
141
|
Names of arguments which will be ignored by the caching mechanism.
|
134
142
|
"""
|
135
143
|
from parsl.app.python import PythonApp
|
136
144
|
|
137
|
-
def decorator(func):
|
138
|
-
def wrapper(f):
|
145
|
+
def decorator(func: Callable) -> Callable:
|
146
|
+
def wrapper(f: Callable) -> PythonApp:
|
139
147
|
return PythonApp(f,
|
140
148
|
data_flow_kernel=data_flow_kernel,
|
141
149
|
cache=cache,
|
@@ -149,11 +157,11 @@ def join_app(function=None,
|
|
149
157
|
|
150
158
|
|
151
159
|
@typeguard.typechecked
|
152
|
-
def bash_app(function=None,
|
160
|
+
def bash_app(function: Optional[Callable] = None,
|
153
161
|
data_flow_kernel: Optional[DataFlowKernel] = None,
|
154
162
|
cache: bool = False,
|
155
163
|
executors: Union[List[str], Literal['all']] = 'all',
|
156
|
-
ignore_for_cache: Optional[
|
164
|
+
ignore_for_cache: Optional[Sequence[str]] = None) -> Callable:
|
157
165
|
"""Decorator function for making bash apps.
|
158
166
|
|
159
167
|
Parameters
|
@@ -177,8 +185,8 @@ def bash_app(function=None,
|
|
177
185
|
"""
|
178
186
|
from parsl.app.bash import BashApp
|
179
187
|
|
180
|
-
def decorator(func):
|
181
|
-
def wrapper(f):
|
188
|
+
def decorator(func: Callable) -> Callable:
|
189
|
+
def wrapper(f: Callable) -> BashApp:
|
182
190
|
return BashApp(f,
|
183
191
|
data_flow_kernel=data_flow_kernel,
|
184
192
|
cache=cache,
|
@@ -4,33 +4,21 @@ from typing import Dict, Tuple
|
|
4
4
|
|
5
5
|
|
6
6
|
class Channel(metaclass=ABCMeta):
|
7
|
-
"""
|
7
|
+
"""Channels are abstractions that enable ExecutionProviders to talk to
|
8
|
+
resource managers of remote compute facilities.
|
9
|
+
|
10
|
+
For certain resources such as campus clusters or supercomputers at
|
8
11
|
research laboratories, resource requirements may require authentication.
|
9
12
|
For instance some resources may allow access to their job schedulers from
|
10
|
-
only their login-nodes which require you to authenticate
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
*SshChannel* authenticates you to remote systems.
|
16
|
-
|
17
|
-
Channels are usually called via the execute_wait function.
|
18
|
-
For channels that execute remotely, a push_file function allows you to copy over files.
|
19
|
-
|
20
|
-
.. code:: python
|
21
|
-
|
22
|
-
+------------------
|
23
|
-
|
|
24
|
-
cmd, wtime ------->| execute_wait
|
25
|
-
(ec, stdout, stderr)<-|---+
|
26
|
-
|
|
27
|
-
src, dst_dir ------->| push_file
|
28
|
-
dst_path <--------|----+
|
29
|
-
|
|
30
|
-
dst_script_dir <------| script_dir
|
31
|
-
|
|
32
|
-
+-------------------
|
13
|
+
only their login-nodes which require you to authenticate through SSH, or
|
14
|
+
require two factor authentication.
|
15
|
+
|
16
|
+
The simplest Channel, *LocalChannel*, executes commands locally in a
|
17
|
+
shell, while the *SSHChannel* authenticates you to remote systems.
|
33
18
|
|
19
|
+
Channels provide the ability to execute commands remotely, using the
|
20
|
+
execute_wait method, and manipulate the remote file system using methods
|
21
|
+
such as push_file, pull_file and makedirs.
|
34
22
|
|
35
23
|
Channels should ensure that each launched command runs in a new process
|
36
24
|
group, so that providers (such as AdHocProvider and LocalProvider) which
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import logging
|
2
2
|
import typeguard
|
3
3
|
|
4
|
-
from typing import Callable,
|
4
|
+
from typing import Callable, Iterable, Optional, Sequence, Union
|
5
5
|
from typing_extensions import Literal
|
6
6
|
|
7
7
|
from parsl.utils import RepresentationMixin
|
@@ -20,9 +20,9 @@ class Config(RepresentationMixin):
|
|
20
20
|
|
21
21
|
Parameters
|
22
22
|
----------
|
23
|
-
executors :
|
24
|
-
List of `ParslExecutor` instances to use for executing tasks.
|
25
|
-
Default is
|
23
|
+
executors : sequence of ParslExecutor, optional
|
24
|
+
List (or other iterable) of `ParslExecutor` instances to use for executing tasks.
|
25
|
+
Default is (:class:`~parsl.executors.threads.ThreadPoolExecutor()`,).
|
26
26
|
app_cache : bool, optional
|
27
27
|
Enable app caching. Default is True.
|
28
28
|
checkpoint_files : sequence of str, optional
|
@@ -73,7 +73,7 @@ class Config(RepresentationMixin):
|
|
73
73
|
|
74
74
|
@typeguard.typechecked
|
75
75
|
def __init__(self,
|
76
|
-
executors: Optional[
|
76
|
+
executors: Optional[Iterable[ParslExecutor]] = None,
|
77
77
|
app_cache: bool = True,
|
78
78
|
checkpoint_files: Optional[Sequence[str]] = None,
|
79
79
|
checkpoint_mode: Union[None,
|
@@ -92,9 +92,14 @@ class Config(RepresentationMixin):
|
|
92
92
|
monitoring: Optional[MonitoringHub] = None,
|
93
93
|
usage_tracking: bool = False,
|
94
94
|
initialize_logging: bool = True) -> None:
|
95
|
-
|
96
|
-
|
97
|
-
|
95
|
+
|
96
|
+
executors = tuple(executors or [])
|
97
|
+
if not executors:
|
98
|
+
executors = (ThreadPoolExecutor(),)
|
99
|
+
|
100
|
+
self._executors: Sequence[ParslExecutor] = executors
|
101
|
+
self._validate_executors()
|
102
|
+
|
98
103
|
self.app_cache = app_cache
|
99
104
|
self.checkpoint_files = checkpoint_files
|
100
105
|
self.checkpoint_mode = checkpoint_mode
|
@@ -125,11 +130,13 @@ class Config(RepresentationMixin):
|
|
125
130
|
def executors(self) -> Sequence[ParslExecutor]:
|
126
131
|
return self._executors
|
127
132
|
|
128
|
-
|
129
|
-
|
130
|
-
|
133
|
+
def _validate_executors(self) -> None:
|
134
|
+
|
135
|
+
if len(self.executors) == 0:
|
136
|
+
raise ConfigurationError('At least one executor must be specified')
|
137
|
+
|
138
|
+
labels = [e.label for e in self.executors]
|
131
139
|
duplicates = [e for n, e in enumerate(labels) if e in labels[:n]]
|
132
140
|
if len(duplicates) > 0:
|
133
141
|
raise ConfigurationError('Executors must have unique labels ({})'.format(
|
134
142
|
', '.join(['label={}'.format(repr(d)) for d in duplicates])))
|
135
|
-
self._executors = executors
|
@@ -9,8 +9,8 @@ user_opts = {'adhoc':
|
|
9
9
|
{'username': 'YOUR_USERNAME',
|
10
10
|
'script_dir': 'YOUR_SCRIPT_DIR',
|
11
11
|
'remote_hostnames': ['REMOTE_HOST_URL_1', 'REMOTE_HOST_URL_2']
|
12
|
+
}
|
12
13
|
}
|
13
|
-
}
|
14
14
|
|
15
15
|
|
16
16
|
config = Config(
|
@@ -26,7 +26,7 @@ config = Config(
|
|
26
26
|
channels=[SSHChannel(hostname=m,
|
27
27
|
username=user_opts['adhoc']['username'],
|
28
28
|
script_dir=user_opts['adhoc']['script_dir'],
|
29
|
-
|
29
|
+
) for m in user_opts['adhoc']['remote_hostnames']]
|
30
30
|
)
|
31
31
|
)
|
32
32
|
],
|
@@ -451,8 +451,8 @@ class DataFlowKernel:
|
|
451
451
|
if isinstance(joinable, Future):
|
452
452
|
je = joinable.exception()
|
453
453
|
if je is not None:
|
454
|
-
if hasattr(joinable, '
|
455
|
-
tid = joinable.
|
454
|
+
if hasattr(joinable, 'task_record'):
|
455
|
+
tid = joinable.task_record['id']
|
456
456
|
else:
|
457
457
|
tid = None
|
458
458
|
exceptions_tids = [(je, tid)]
|
@@ -460,8 +460,8 @@ class DataFlowKernel:
|
|
460
460
|
for future in joinable:
|
461
461
|
je = future.exception()
|
462
462
|
if je is not None:
|
463
|
-
if hasattr(joinable, '
|
464
|
-
tid = joinable.
|
463
|
+
if hasattr(joinable, 'task_record'):
|
464
|
+
tid = joinable.task_record['id']
|
465
465
|
else:
|
466
466
|
tid = None
|
467
467
|
exceptions_tids.append((je, tid))
|
@@ -854,8 +854,8 @@ class DataFlowKernel:
|
|
854
854
|
try:
|
855
855
|
new_args.extend([dep.result()])
|
856
856
|
except Exception as e:
|
857
|
-
if hasattr(dep, '
|
858
|
-
tid = dep.
|
857
|
+
if hasattr(dep, 'task_record'):
|
858
|
+
tid = dep.task_record['id']
|
859
859
|
else:
|
860
860
|
tid = None
|
861
861
|
dep_failures.extend([(e, tid)])
|
@@ -869,8 +869,8 @@ class DataFlowKernel:
|
|
869
869
|
try:
|
870
870
|
kwargs[key] = dep.result()
|
871
871
|
except Exception as e:
|
872
|
-
if hasattr(dep, '
|
873
|
-
tid = dep.
|
872
|
+
if hasattr(dep, 'task_record'):
|
873
|
+
tid = dep.task_record['id']
|
874
874
|
else:
|
875
875
|
tid = None
|
876
876
|
dep_failures.extend([(e, tid)])
|
@@ -883,8 +883,8 @@ class DataFlowKernel:
|
|
883
883
|
try:
|
884
884
|
new_inputs.extend([dep.result()])
|
885
885
|
except Exception as e:
|
886
|
-
if hasattr(dep, '
|
887
|
-
tid = dep.
|
886
|
+
if hasattr(dep, 'task_record'):
|
887
|
+
tid = dep.task_record['id']
|
888
888
|
else:
|
889
889
|
tid = None
|
890
890
|
dep_failures.extend([(e, tid)])
|
@@ -918,7 +918,7 @@ class DataFlowKernel:
|
|
918
918
|
- executors (list or string) : List of executors this call could go to.
|
919
919
|
Default='all'
|
920
920
|
- cache (Bool) : To enable memoization or not
|
921
|
-
- ignore_for_cache (
|
921
|
+
- ignore_for_cache (sequence) : List of kwargs to be ignored for memoization/checkpointing
|
922
922
|
- app_kwargs (dict) : Rest of the kwargs to the fn passed as dict.
|
923
923
|
|
924
924
|
Returns:
|
@@ -967,38 +967,40 @@ class DataFlowKernel:
|
|
967
967
|
|
968
968
|
resource_specification = app_kwargs.get('parsl_resource_specification', {})
|
969
969
|
|
970
|
-
|
971
|
-
|
972
|
-
|
973
|
-
|
974
|
-
|
975
|
-
|
976
|
-
|
977
|
-
|
978
|
-
|
979
|
-
|
980
|
-
|
981
|
-
|
982
|
-
|
983
|
-
|
984
|
-
|
985
|
-
|
986
|
-
|
987
|
-
|
988
|
-
|
989
|
-
|
990
|
-
|
991
|
-
|
992
|
-
|
993
|
-
|
994
|
-
|
970
|
+
task_record: TaskRecord
|
971
|
+
task_record = {'depends': [],
|
972
|
+
'dfk': self,
|
973
|
+
'executor': executor,
|
974
|
+
'func_name': func.__name__,
|
975
|
+
'memoize': cache,
|
976
|
+
'hashsum': None,
|
977
|
+
'exec_fu': None,
|
978
|
+
'fail_count': 0,
|
979
|
+
'fail_cost': 0,
|
980
|
+
'fail_history': [],
|
981
|
+
'from_memo': None,
|
982
|
+
'ignore_for_cache': ignore_for_cache,
|
983
|
+
'join': join,
|
984
|
+
'joins': None,
|
985
|
+
'try_id': 0,
|
986
|
+
'id': task_id,
|
987
|
+
'task_launch_lock': threading.Lock(),
|
988
|
+
'time_invoked': datetime.datetime.now(),
|
989
|
+
'time_returned': None,
|
990
|
+
'try_time_launched': None,
|
991
|
+
'try_time_returned': None,
|
992
|
+
'resource_specification': resource_specification}
|
993
|
+
|
994
|
+
self.update_task_state(task_record, States.unsched)
|
995
|
+
|
996
|
+
app_fu = AppFuture(task_record)
|
995
997
|
|
996
998
|
# Transform remote input files to data futures
|
997
999
|
app_args, app_kwargs, func = self._add_input_deps(executor, app_args, app_kwargs, func)
|
998
1000
|
|
999
1001
|
func = self._add_output_deps(executor, app_args, app_kwargs, app_fu, func)
|
1000
1002
|
|
1001
|
-
|
1003
|
+
task_record.update({
|
1002
1004
|
'args': app_args,
|
1003
1005
|
'func': func,
|
1004
1006
|
'kwargs': app_kwargs,
|
@@ -1006,11 +1008,11 @@ class DataFlowKernel:
|
|
1006
1008
|
|
1007
1009
|
assert task_id not in self.tasks
|
1008
1010
|
|
1009
|
-
self.tasks[task_id] =
|
1011
|
+
self.tasks[task_id] = task_record
|
1010
1012
|
|
1011
1013
|
# Get the list of dependencies for the task
|
1012
1014
|
depends = self._gather_all_deps(app_args, app_kwargs)
|
1013
|
-
|
1015
|
+
task_record['depends'] = depends
|
1014
1016
|
|
1015
1017
|
depend_descs = []
|
1016
1018
|
for d in depends:
|
@@ -1025,16 +1027,14 @@ class DataFlowKernel:
|
|
1025
1027
|
waiting_message = "not waiting on any dependency"
|
1026
1028
|
|
1027
1029
|
logger.info("Task {} submitted for App {}, {}".format(task_id,
|
1028
|
-
|
1030
|
+
task_record['func_name'],
|
1029
1031
|
waiting_message))
|
1030
1032
|
|
1031
|
-
|
1033
|
+
app_fu.add_done_callback(partial(self.handle_app_update, task_record))
|
1034
|
+
self.update_task_state(task_record, States.pending)
|
1035
|
+
logger.debug("Task {} set to pending state with AppFuture: {}".format(task_id, task_record['app_fu']))
|
1032
1036
|
|
1033
|
-
|
1034
|
-
self.update_task_state(task_def, States.pending)
|
1035
|
-
logger.debug("Task {} set to pending state with AppFuture: {}".format(task_id, task_def['app_fu']))
|
1036
|
-
|
1037
|
-
self._send_task_log_info(task_def)
|
1037
|
+
self._send_task_log_info(task_record)
|
1038
1038
|
|
1039
1039
|
# at this point add callbacks to all dependencies to do a launch_if_ready
|
1040
1040
|
# call whenever a dependency completes.
|
@@ -1051,14 +1051,14 @@ class DataFlowKernel:
|
|
1051
1051
|
for d in depends:
|
1052
1052
|
|
1053
1053
|
def callback_adapter(dep_fut: Future) -> None:
|
1054
|
-
self.launch_if_ready(
|
1054
|
+
self.launch_if_ready(task_record)
|
1055
1055
|
|
1056
1056
|
try:
|
1057
1057
|
d.add_done_callback(callback_adapter)
|
1058
1058
|
except Exception as e:
|
1059
1059
|
logger.error("add_done_callback got an exception {} which will be ignored".format(e))
|
1060
1060
|
|
1061
|
-
self.launch_if_ready(
|
1061
|
+
self.launch_if_ready(task_record)
|
1062
1062
|
|
1063
1063
|
return app_fu
|
1064
1064
|
|
@@ -1090,7 +1090,14 @@ class DataFlowKernel:
|
|
1090
1090
|
"""
|
1091
1091
|
run_dir = self.run_dir
|
1092
1092
|
if channel.script_dir is None:
|
1093
|
-
|
1093
|
+
|
1094
|
+
# This case will be detected as unreachable by mypy, because of
|
1095
|
+
# the type of script_dir, which is str, not Optional[str].
|
1096
|
+
# The type system doesn't represent the initialized/uninitialized
|
1097
|
+
# state of a channel so cannot represent that a channel needs
|
1098
|
+
# its script directory set or not.
|
1099
|
+
|
1100
|
+
channel.script_dir = os.path.join(run_dir, 'submit_scripts') # type: ignore[unreachable]
|
1094
1101
|
|
1095
1102
|
# Only create dirs if we aren't on a shared-fs
|
1096
1103
|
if not channel.isdir(run_dir):
|
@@ -5,11 +5,14 @@ We have two basic types of futures:
|
|
5
5
|
2. AppFutures which represent the futures on App/Leaf tasks.
|
6
6
|
|
7
7
|
"""
|
8
|
+
from __future__ import annotations
|
8
9
|
|
9
10
|
from concurrent.futures import Future
|
10
11
|
import logging
|
11
12
|
import threading
|
12
|
-
from typing import Optional, Sequence
|
13
|
+
from typing import Any, Optional, Sequence
|
14
|
+
|
15
|
+
import parsl.app.app as app
|
13
16
|
|
14
17
|
from parsl.app.futures import DataFuture
|
15
18
|
from parsl.dataflow.taskrecord import TaskRecord
|
@@ -59,32 +62,32 @@ class AppFuture(Future):
|
|
59
62
|
|
60
63
|
"""
|
61
64
|
|
62
|
-
def __init__(self,
|
65
|
+
def __init__(self, task_record: TaskRecord) -> None:
|
63
66
|
"""Initialize the AppFuture.
|
64
67
|
|
65
68
|
Args:
|
66
69
|
|
67
70
|
KWargs:
|
68
|
-
-
|
69
|
-
|
71
|
+
- task_record : The TaskRecord for the task represented by
|
72
|
+
this future.
|
70
73
|
"""
|
71
74
|
super().__init__()
|
72
75
|
self._update_lock = threading.Lock()
|
73
76
|
self._outputs: Sequence[DataFuture]
|
74
77
|
self._outputs = []
|
75
|
-
self.
|
78
|
+
self.task_record = task_record
|
76
79
|
|
77
80
|
@property
|
78
81
|
def stdout(self) -> Optional[str]:
|
79
|
-
return self.
|
82
|
+
return self.task_record['kwargs'].get('stdout')
|
80
83
|
|
81
84
|
@property
|
82
85
|
def stderr(self) -> Optional[str]:
|
83
|
-
return self.
|
86
|
+
return self.task_record['kwargs'].get('stderr')
|
84
87
|
|
85
88
|
@property
|
86
89
|
def tid(self) -> int:
|
87
|
-
return self.
|
90
|
+
return self.task_record['id']
|
88
91
|
|
89
92
|
def cancel(self) -> bool:
|
90
93
|
raise NotImplementedError("Cancel not implemented")
|
@@ -113,8 +116,35 @@ class AppFuture(Future):
|
|
113
116
|
|
114
117
|
Returns: str
|
115
118
|
"""
|
116
|
-
return self.
|
119
|
+
return self.task_record['status'].name
|
117
120
|
|
118
121
|
@property
|
119
122
|
def outputs(self) -> Sequence[DataFuture]:
|
120
123
|
return self._outputs
|
124
|
+
|
125
|
+
def __getitem__(self, key: Any) -> AppFuture:
|
126
|
+
# This is decorated on each invocation because the getitem task
|
127
|
+
# should be bound to the same DFK as the task associated with this
|
128
|
+
# Future.
|
129
|
+
deferred_getitem_app = app.python_app(deferred_getitem, executors=['_parsl_internal'], data_flow_kernel=self.task_record['dfk'])
|
130
|
+
|
131
|
+
return deferred_getitem_app(self, key)
|
132
|
+
|
133
|
+
def __getattr__(self, name: str) -> AppFuture:
|
134
|
+
# this will avoid lifting behaviour on private methods and attributes,
|
135
|
+
# including __double_underscore__ methods which implement other
|
136
|
+
# Python syntax (such as iterators in for loops)
|
137
|
+
if name.startswith("_"):
|
138
|
+
raise AttributeError()
|
139
|
+
|
140
|
+
deferred_getattr_app = app.python_app(deferred_getattr, executors=['_parsl_internal'], data_flow_kernel=self.task_record['dfk'])
|
141
|
+
|
142
|
+
return deferred_getattr_app(self, name)
|
143
|
+
|
144
|
+
|
145
|
+
def deferred_getitem(o: Any, k: Any) -> Any:
|
146
|
+
return o[k]
|
147
|
+
|
148
|
+
|
149
|
+
def deferred_getattr(o: Any, name: str) -> Any:
|
150
|
+
return getattr(o, name)
|
@@ -5,18 +5,25 @@ import datetime
|
|
5
5
|
from typing_extensions import TypedDict
|
6
6
|
from concurrent.futures import Future
|
7
7
|
|
8
|
+
|
8
9
|
# only for type checking:
|
9
10
|
from typing import Any, Callable, Dict, Optional, List, Sequence, TYPE_CHECKING, Union
|
10
11
|
|
11
12
|
if TYPE_CHECKING:
|
12
13
|
from parsl.dataflow.futures import AppFuture
|
13
14
|
|
15
|
+
import parsl.dataflow.dflow as dflow
|
16
|
+
|
14
17
|
from parsl.dataflow.states import States
|
15
18
|
|
16
19
|
|
17
20
|
class TaskRecord(TypedDict, total=False):
|
18
21
|
"""This stores most information about a Parsl task"""
|
19
22
|
|
23
|
+
dfk: dflow.DataFlowKernel
|
24
|
+
"""The DataFlowKernel which is managing this task.
|
25
|
+
"""
|
26
|
+
|
20
27
|
func_name: str
|
21
28
|
|
22
29
|
status: States
|
@@ -479,10 +479,10 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin):
|
|
479
479
|
"heartbeat_threshold": self.heartbeat_threshold,
|
480
480
|
"poll_period": self.poll_period,
|
481
481
|
"logging_level": logging.DEBUG if self.worker_debug else logging.INFO
|
482
|
-
|
482
|
+
},
|
483
483
|
daemon=True,
|
484
484
|
name="HTEX-Interchange"
|
485
|
-
|
485
|
+
)
|
486
486
|
self.interchange_proc.start()
|
487
487
|
try:
|
488
488
|
(self.worker_task_port, self.worker_result_port) = comm_q.get(block=True, timeout=120)
|