parsl 2025.9.1__tar.gz → 2025.11.10__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-2025.11.10/PKG-INFO +114 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/README.rst +5 -2
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/__init__.py +0 -4
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/app/bash.py +1 -1
- parsl-2025.11.10/parsl/benchmark/perf.py +157 -0
- parsl-2025.11.10/parsl/concurrent/__init__.py +166 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/curvezmq.py +0 -16
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/data_provider/globus.py +3 -1
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/dataflow/dflow.py +106 -206
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/dataflow/memoization.py +144 -31
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/dataflow/states.py +5 -5
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/base.py +2 -2
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/execute_task.py +2 -8
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/flux/executor.py +4 -6
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/globus_compute.py +0 -4
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/high_throughput/executor.py +86 -24
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/high_throughput/interchange.py +55 -42
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/high_throughput/mpi_executor.py +1 -2
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/high_throughput/mpi_resource_management.py +7 -14
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/high_throughput/process_worker_pool.py +32 -7
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/high_throughput/zmq_pipes.py +36 -67
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/radical/executor.py +2 -6
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/radical/rpex_worker.py +2 -2
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/taskvine/executor.py +5 -1
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/threads.py +5 -2
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/jobs/states.py +2 -2
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/jobs/strategy.py +7 -6
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/db_manager.py +8 -8
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/monitoring.py +2 -2
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/radios/filesystem.py +2 -1
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/radios/htex.py +2 -1
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/radios/multiprocessing.py +2 -1
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/radios/udp.py +2 -1
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/radios/udp_router.py +2 -2
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/radios/zmq_router.py +2 -2
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/multiprocessing.py +0 -49
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/base.py +24 -37
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/pbspro/pbspro.py +1 -1
- parsl-2025.11.10/parsl/serialize/__init__.py +13 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/serialize/facade.py +0 -32
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/local_threads_globus.py +18 -14
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/taskvine_ex.py +1 -1
- parsl-2025.11.10/parsl/tests/sites/test_concurrent.py +96 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_checkpointing/test_periodic.py +15 -9
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +6 -3
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_checkpointing/test_regression_233.py +0 -1
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_curvezmq.py +0 -42
- parsl-2025.11.10/parsl/tests/test_execute_task.py +20 -0
- parsl-2025.11.10/parsl/tests/test_htex/test_command_concurrency_regression_1321.py +54 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_htex.py +36 -1
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_interchange_exit_bad_registration.py +2 -2
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_priority_queue.py +26 -3
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_zmq_binding.py +2 -1
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_mpi_apps/test_mpi_scheduler.py +18 -43
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_basic.py +0 -14
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_depfail_propagation.py +11 -1
- parsl-2025.11.10/parsl/tests/test_python_apps/test_exception.py +19 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_garbage_collect.py +1 -6
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_memoize_2.py +11 -1
- parsl-2025.11.10/parsl/tests/test_python_apps/test_memoize_exception.py +41 -0
- parsl-2025.11.10/parsl/tests/test_regression/test_3874.py +47 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_scaling/test_regression_3696_oscillation.py +1 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_staging/test_staging_globus.py +2 -2
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/unit/test_globus_compute_executor.py +11 -2
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/utils.py +8 -3
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/version.py +1 -1
- parsl-2025.11.10/parsl.egg-info/PKG-INFO +114 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl.egg-info/SOURCES.txt +4 -9
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl.egg-info/requires.txt +4 -1
- {parsl-2025.9.1 → parsl-2025.11.10}/requirements.txt +0 -1
- {parsl-2025.9.1 → parsl-2025.11.10}/setup.py +2 -2
- parsl-2025.9.1/PKG-INFO +0 -35
- parsl-2025.9.1/parsl/benchmark/perf.py +0 -101
- parsl-2025.9.1/parsl/concurrent/__init__.py +0 -85
- parsl-2025.9.1/parsl/serialize/__init__.py +0 -16
- parsl-2025.9.1/parsl/tests/configs/local_threads_checkpoint_periodic.py +0 -11
- parsl-2025.9.1/parsl/tests/configs/local_threads_no_cache.py +0 -11
- parsl-2025.9.1/parsl/tests/site_tests/test_provider.py +0 -88
- parsl-2025.9.1/parsl/tests/site_tests/test_site.py +0 -70
- parsl-2025.9.1/parsl/tests/sites/test_concurrent.py +0 -48
- parsl-2025.9.1/parsl/tests/test_aalst_patterns.py +0 -474
- parsl-2025.9.1/parsl/tests/test_docs/test_workflow2.py +0 -42
- parsl-2025.9.1/parsl/tests/test_error_handling/test_rand_fail.py +0 -171
- parsl-2025.9.1/parsl/tests/test_execute_task.py +0 -29
- parsl-2025.9.1/parsl/tests/test_regression/test_854.py +0 -62
- parsl-2025.9.1/parsl/tests/test_serialization/test_pack_resource_spec.py +0 -23
- parsl-2025.9.1/parsl.egg-info/PKG-INFO +0 -35
- {parsl-2025.9.1 → parsl-2025.11.10}/LICENSE +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/MANIFEST.in +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/addresses.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/app/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/app/app.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/app/errors.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/app/futures.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/app/python.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/benchmark/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/config.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/ASPIRE1.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/Azure.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/anvil.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/bridges.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/cc_in2p3.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/delta.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/ec2.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/expanse.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/frontera.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/gc_multisite.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/gc_tutorial.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/htex_local.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/illinoiscluster.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/improv.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/kubernetes.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/local_threads.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/midway.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/osg.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/polaris.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/stampede2.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/summit.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/toss3_llnl.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/vineex_local.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/wqex_local.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/data_provider/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/data_provider/data_manager.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/data_provider/file_noop.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/data_provider/files.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/data_provider/ftp.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/data_provider/http.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/data_provider/rsync.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/data_provider/staging.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/data_provider/zip.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/dataflow/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/dataflow/dependency_resolvers.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/dataflow/errors.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/dataflow/futures.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/dataflow/rundirs.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/dataflow/taskrecord.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/errors.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/errors.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/flux/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/flux/execute_parsl_task.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/flux/flux_instance_manager.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/high_throughput/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/high_throughput/errors.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/high_throughput/manager_record.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/high_throughput/manager_selector.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/high_throughput/monitoring_info.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/high_throughput/mpi_prefix_composer.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/high_throughput/probe.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/radical/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/radical/rpex_resources.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/status_handling.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/taskvine/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/taskvine/errors.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/taskvine/exec_parsl_function.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/taskvine/factory.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/taskvine/factory_config.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/taskvine/manager.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/taskvine/manager_config.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/taskvine/utils.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/workqueue/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/workqueue/errors.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/workqueue/exec_parsl_function.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/workqueue/executor.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/workqueue/parsl_coprocess.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/jobs/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/jobs/error_handlers.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/jobs/errors.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/jobs/job_status_poller.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/launchers/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/launchers/base.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/launchers/errors.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/launchers/launchers.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/log_utils.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/errors.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/message_type.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/queries/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/queries/pandas.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/radios/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/radios/base.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/radios/filesystem_router.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/radios/zmq.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/remote.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/types.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/app.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/models.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/plots/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/plots/default/workflow_plots.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/templates/app.html +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/templates/dag.html +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/templates/error.html +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/templates/layout.html +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/templates/task.html +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/templates/workflow.html +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/utils.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/version.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/views.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/process_loggers.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/aws/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/aws/aws.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/aws/template.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/azure/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/azure/azure.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/azure/template.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/cluster_provider.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/condor/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/condor/condor.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/condor/template.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/errors.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/googlecloud/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/googlecloud/googlecloud.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/grid_engine/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/grid_engine/grid_engine.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/grid_engine/template.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/kubernetes/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/kubernetes/kube.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/kubernetes/template.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/local/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/local/local.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/lsf/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/lsf/lsf.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/lsf/template.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/pbspro/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/pbspro/template.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/slurm/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/slurm/slurm.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/slurm/template.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/torque/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/torque/template.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/torque/torque.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/py.typed +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/serialize/base.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/serialize/concretes.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/serialize/errors.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/serialize/proxystore.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/callables_helper.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/azure_single_node.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/bluewaters.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/bridges.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/cc_in2p3.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/comet.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/ec2_single_node.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/ec2_spot.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/flux_local.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/frontera.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/globus_compute.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/htex_local.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/htex_local_alternate.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/htex_local_intask_staging.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/htex_local_rsync_staging.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/local_radical.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/local_radical_mpi.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/local_threads.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/midway.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/nscc_singapore.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/osg_htex.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/petrelkube.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/slurm_local.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/summit.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/user_opts.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/workqueue_ex.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/conftest.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/integration/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/integration/latency.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/integration/test_apps/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/integration/test_stress/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/manual_tests/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/manual_tests/htex_local.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/manual_tests/test_basic.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/manual_tests/test_log_filter.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/manual_tests/test_memory_limits.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/manual_tests/test_regression_220.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/manual_tests/test_worker_count.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/site_tests/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/site_tests/site_config_selector.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/sites/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/sites/test_affinity.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/sites/test_dynamic_executor.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/sites/test_ec2.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/sites/test_launchers.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/sites/test_mpi/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/sites/test_worker_info.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_bash_apps/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_bash_apps/test_basic.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_bash_apps/test_inputs_default.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_bash_apps/test_memoize.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_bash_apps/test_multiline.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_bash_apps/test_pipeline.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_bash_apps/test_std_uri.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_bash_apps/test_stdout.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_callables.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_checkpointing/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_checkpointing/test_task_exit.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_docs/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_docs/test_from_slides.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_docs/test_kwargs.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_docs/test_workflow1.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_docs/test_workflow4.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_error_handling/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_error_handling/test_fail.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_error_handling/test_python_walltime.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_error_handling/test_resource_spec.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_error_handling/test_retries.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_flowcontrol/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_flux.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_basic.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_block_manager_selector_unit.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_command_client_timeout.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_connected_blocks.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_cpu_affinity_explicit.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_disconnected_blocks.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_disconnected_blocks_failing_provider.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_drain.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_manager_failure.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_manager_selector_by_block.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_managers_command.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_missing_worker.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_multiple_disconnected_blocks.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_resource_spec_validation.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_worker_failure.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_monitoring/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_monitoring/test_app_names.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_monitoring/test_basic.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_monitoring/test_exit_helper.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_monitoring/test_htex_fuzz_zmq.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_monitoring/test_incomplete_futures.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_monitoring/test_memoization_representation.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_monitoring/test_radio_filesystem.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_monitoring/test_radio_multiprocessing.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_monitoring/test_radio_udp.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_monitoring/test_radio_zmq.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_monitoring/test_stdouterr.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_mpi_apps/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_mpi_apps/test_bad_mpi_config.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_mpi_apps/test_mpi_prefix.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_mpi_apps/test_mpiex.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_mpi_apps/test_resource_spec.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_providers/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_providers/test_kubernetes_provider.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_providers/test_local_provider.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_providers/test_pbspro_template.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_providers/test_slurm_instantiate.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_providers/test_slurm_template.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_providers/test_submiterror_deprecation.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_context_manager.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_dep_standard_futures.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_dependencies_deep.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_fail.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_futures.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_inputs_default.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_join.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_lifted.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_mapred.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_outputs.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_overview.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_pipeline.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_pluggable_future_resolution.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_simple.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_timeout.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_type5.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_radical/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_radical/test_mpi_funcs.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_regression/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_regression/test_1480.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_regression/test_1653.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_regression/test_221.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_regression/test_226.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_regression/test_2652.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_regression/test_69a.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_regression/test_97_parallelism_0.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_regression/test_98.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_scaling/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_scaling/test_block_error_handler.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_scaling/test_regression_1621.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_scaling/test_regression_3568_scaledown_vs_MISSING.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_scaling/test_scale_down.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_scaling/test_shutdown_scalein.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_scaling/test_worker_interchange_bad_messages_3262.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_serialization/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_serialization/test_2555_caching_deserializer.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_serialization/test_3495_deserialize_managerlost.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_serialization/test_basic.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_serialization/test_htex_code_cache.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_serialization/test_proxystore_configured.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_serialization/test_proxystore_impl.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_shutdown/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_shutdown/test_kill_monitoring.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_staging/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_staging/staging_provider.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_staging/test_1316.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_staging/test_docs_1.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_staging/test_docs_2.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_staging/test_file.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_staging/test_file_apps.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_staging/test_file_staging.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_staging/test_output_chain_filenames.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_staging/test_staging_https.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_staging/test_staging_stdout.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_staging/test_zip_in.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_staging/test_zip_out.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_staging/test_zip_to_zip.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_summary.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_thread_parallelism.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_threads/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_threads/test_configs.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_utils/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_utils/test_execute_wait.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_utils/test_logutils.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_utils/test_representation_mixin.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_utils/test_sanitize_dns.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/unit/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/unit/test_address.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/unit/test_file.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/unit/test_usage_tracking.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/utils.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/usage_tracking/__init__.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/usage_tracking/api.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/usage_tracking/levels.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl/usage_tracking/usage.py +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl.egg-info/dependency_links.txt +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl.egg-info/entry_points.txt +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/parsl.egg-info/top_level.txt +0 -0
- {parsl-2025.9.1 → parsl-2025.11.10}/setup.cfg +0 -0
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: parsl
|
|
3
|
+
Version: 2025.11.10
|
|
4
|
+
Summary: Simple data dependent workflows in Python
|
|
5
|
+
Home-page: https://github.com/Parsl/parsl
|
|
6
|
+
Download-URL: https://github.com/Parsl/parsl/archive/2025.11.10.tar.gz
|
|
7
|
+
Author: The Parsl Team
|
|
8
|
+
Author-email: parsl@googlegroups.com
|
|
9
|
+
License: Apache 2.0
|
|
10
|
+
Keywords: Workflows,Scientific computing
|
|
11
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
12
|
+
Classifier: Intended Audience :: Developers
|
|
13
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Requires-Python: >=3.10.0
|
|
18
|
+
License-File: LICENSE
|
|
19
|
+
Requires-Dist: pyzmq>=17.1.2
|
|
20
|
+
Requires-Dist: typeguard!=3.*,<5,>=2.10
|
|
21
|
+
Requires-Dist: typing-extensions<5,>=4.6
|
|
22
|
+
Requires-Dist: dill
|
|
23
|
+
Requires-Dist: tblib
|
|
24
|
+
Requires-Dist: requests
|
|
25
|
+
Requires-Dist: sortedcontainers
|
|
26
|
+
Requires-Dist: psutil>=5.5.1
|
|
27
|
+
Requires-Dist: setproctitle
|
|
28
|
+
Requires-Dist: filelock<4,>=3.13
|
|
29
|
+
Provides-Extra: monitoring
|
|
30
|
+
Requires-Dist: sqlalchemy<2.1,>=2; extra == "monitoring"
|
|
31
|
+
Provides-Extra: visualization
|
|
32
|
+
Requires-Dist: pydot>=1.4.2; extra == "visualization"
|
|
33
|
+
Requires-Dist: networkx<3.3,>=3.2; extra == "visualization"
|
|
34
|
+
Requires-Dist: Flask>=1.0.2; extra == "visualization"
|
|
35
|
+
Requires-Dist: flask_sqlalchemy; extra == "visualization"
|
|
36
|
+
Requires-Dist: pandas<3,>=2.2; extra == "visualization"
|
|
37
|
+
Requires-Dist: plotly; extra == "visualization"
|
|
38
|
+
Requires-Dist: python-daemon; extra == "visualization"
|
|
39
|
+
Provides-Extra: aws
|
|
40
|
+
Requires-Dist: boto3; extra == "aws"
|
|
41
|
+
Provides-Extra: kubernetes
|
|
42
|
+
Requires-Dist: kubernetes; extra == "kubernetes"
|
|
43
|
+
Provides-Extra: docs
|
|
44
|
+
Requires-Dist: ipython<=8.6.0; extra == "docs"
|
|
45
|
+
Requires-Dist: nbsphinx; extra == "docs"
|
|
46
|
+
Requires-Dist: sphinx<8,>=7.4; extra == "docs"
|
|
47
|
+
Requires-Dist: sphinx_rtd_theme; extra == "docs"
|
|
48
|
+
Provides-Extra: google-cloud
|
|
49
|
+
Requires-Dist: google-auth; extra == "google-cloud"
|
|
50
|
+
Requires-Dist: google-api-python-client; extra == "google-cloud"
|
|
51
|
+
Provides-Extra: gssapi
|
|
52
|
+
Requires-Dist: python-gssapi; extra == "gssapi"
|
|
53
|
+
Provides-Extra: azure
|
|
54
|
+
Requires-Dist: azure<=4; extra == "azure"
|
|
55
|
+
Requires-Dist: msrestazure; extra == "azure"
|
|
56
|
+
Provides-Extra: workqueue
|
|
57
|
+
Requires-Dist: work_queue; extra == "workqueue"
|
|
58
|
+
Provides-Extra: flux
|
|
59
|
+
Requires-Dist: pyyaml; extra == "flux"
|
|
60
|
+
Requires-Dist: cffi; extra == "flux"
|
|
61
|
+
Requires-Dist: jsonschema; extra == "flux"
|
|
62
|
+
Provides-Extra: proxystore
|
|
63
|
+
Requires-Dist: proxystore; extra == "proxystore"
|
|
64
|
+
Provides-Extra: radical-pilot
|
|
65
|
+
Requires-Dist: radical.pilot==1.90; extra == "radical-pilot"
|
|
66
|
+
Requires-Dist: radical.utils==1.90; extra == "radical-pilot"
|
|
67
|
+
Provides-Extra: globus-compute
|
|
68
|
+
Requires-Dist: globus_compute_sdk>=2.34.0; extra == "globus-compute"
|
|
69
|
+
Provides-Extra: globus-transfer
|
|
70
|
+
Requires-Dist: globus-sdk; extra == "globus-transfer"
|
|
71
|
+
Provides-Extra: all
|
|
72
|
+
Requires-Dist: sqlalchemy<2.1,>=2; extra == "all"
|
|
73
|
+
Requires-Dist: pydot>=1.4.2; extra == "all"
|
|
74
|
+
Requires-Dist: networkx<3.3,>=3.2; extra == "all"
|
|
75
|
+
Requires-Dist: Flask>=1.0.2; extra == "all"
|
|
76
|
+
Requires-Dist: flask_sqlalchemy; extra == "all"
|
|
77
|
+
Requires-Dist: pandas<3,>=2.2; extra == "all"
|
|
78
|
+
Requires-Dist: plotly; extra == "all"
|
|
79
|
+
Requires-Dist: python-daemon; extra == "all"
|
|
80
|
+
Requires-Dist: boto3; extra == "all"
|
|
81
|
+
Requires-Dist: kubernetes; extra == "all"
|
|
82
|
+
Requires-Dist: ipython<=8.6.0; extra == "all"
|
|
83
|
+
Requires-Dist: nbsphinx; extra == "all"
|
|
84
|
+
Requires-Dist: sphinx<8,>=7.4; extra == "all"
|
|
85
|
+
Requires-Dist: sphinx_rtd_theme; extra == "all"
|
|
86
|
+
Requires-Dist: google-auth; extra == "all"
|
|
87
|
+
Requires-Dist: google-api-python-client; extra == "all"
|
|
88
|
+
Requires-Dist: python-gssapi; extra == "all"
|
|
89
|
+
Requires-Dist: azure<=4; extra == "all"
|
|
90
|
+
Requires-Dist: msrestazure; extra == "all"
|
|
91
|
+
Requires-Dist: work_queue; extra == "all"
|
|
92
|
+
Requires-Dist: pyyaml; extra == "all"
|
|
93
|
+
Requires-Dist: cffi; extra == "all"
|
|
94
|
+
Requires-Dist: jsonschema; extra == "all"
|
|
95
|
+
Requires-Dist: proxystore; extra == "all"
|
|
96
|
+
Requires-Dist: radical.pilot==1.90; extra == "all"
|
|
97
|
+
Requires-Dist: radical.utils==1.90; extra == "all"
|
|
98
|
+
Requires-Dist: globus_compute_sdk>=2.34.0; extra == "all"
|
|
99
|
+
Requires-Dist: globus-sdk; extra == "all"
|
|
100
|
+
Dynamic: author
|
|
101
|
+
Dynamic: author-email
|
|
102
|
+
Dynamic: classifier
|
|
103
|
+
Dynamic: description
|
|
104
|
+
Dynamic: download-url
|
|
105
|
+
Dynamic: home-page
|
|
106
|
+
Dynamic: keywords
|
|
107
|
+
Dynamic: license
|
|
108
|
+
Dynamic: license-file
|
|
109
|
+
Dynamic: provides-extra
|
|
110
|
+
Dynamic: requires-dist
|
|
111
|
+
Dynamic: requires-python
|
|
112
|
+
Dynamic: summary
|
|
113
|
+
|
|
114
|
+
Simple parallel workflows system for Python
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Parsl - Parallel Scripting Library
|
|
2
2
|
==================================
|
|
3
|
-
|licence| |docs| |NSF-1550588| |NSF-1550476| |NSF-1550562| |NSF-1550528| |NumFOCUS| |CZI-EOSS|
|
|
3
|
+
|licence| |docs| |NSF-1550588| |NSF-1550476| |NSF-1550562| |NSF-1550528| |NumFOCUS| |CZI-EOSS| |paper|
|
|
4
4
|
|
|
5
5
|
Parsl extends parallelism in Python beyond a single computer.
|
|
6
6
|
|
|
@@ -67,6 +67,9 @@ then explore the `parallel computing patterns <https://parsl.readthedocs.io/en/s
|
|
|
67
67
|
.. |NumFOCUS| image:: https://img.shields.io/badge/powered%20by-NumFOCUS-orange.svg?style=flat&colorA=E1523D&colorB=007D8A
|
|
68
68
|
:target: https://numfocus.org
|
|
69
69
|
:alt: Powered by NumFOCUS
|
|
70
|
+
.. |paper| image:: https://img.shields.io/badge/Software_DOI-10.1145/3307681.3325400-blue
|
|
71
|
+
:target: https://doi.org/10.1145/3307681.3325400
|
|
72
|
+
:alt: Conference proceedings paper
|
|
70
73
|
|
|
71
74
|
|
|
72
75
|
Quickstart
|
|
@@ -120,7 +123,7 @@ For Developers
|
|
|
120
123
|
Requirements
|
|
121
124
|
============
|
|
122
125
|
|
|
123
|
-
Parsl is supported in Python 3.
|
|
126
|
+
Parsl is supported in Python 3.10+. Requirements can be found `here <requirements.txt>`_. Requirements for running tests can be found `here <test-requirements.txt>`_.
|
|
124
127
|
|
|
125
128
|
Code of Conduct
|
|
126
129
|
===============
|
|
@@ -15,7 +15,6 @@ AUTO_LOGNAME
|
|
|
15
15
|
|
|
16
16
|
"""
|
|
17
17
|
import logging
|
|
18
|
-
import multiprocessing as _multiprocessing
|
|
19
18
|
import os
|
|
20
19
|
import platform
|
|
21
20
|
|
|
@@ -32,9 +31,6 @@ from parsl.log_utils import set_file_logger, set_stream_logger
|
|
|
32
31
|
from parsl.monitoring import MonitoringHub
|
|
33
32
|
from parsl.version import VERSION
|
|
34
33
|
|
|
35
|
-
if platform.system() == 'Darwin':
|
|
36
|
-
_multiprocessing.set_start_method('fork', force=True)
|
|
37
|
-
|
|
38
34
|
__author__ = 'The Parsl Team'
|
|
39
35
|
__version__ = VERSION
|
|
40
36
|
|
|
@@ -88,7 +88,7 @@ def remote_side_bash_executor(func, *args, **kwargs):
|
|
|
88
88
|
raise pe.AppTimeout(f"App {func_name} exceeded walltime: {timeout} seconds")
|
|
89
89
|
|
|
90
90
|
except Exception as e:
|
|
91
|
-
raise pe.AppException(f"App {func_name} caught exception
|
|
91
|
+
raise pe.AppException(f"App {func_name} caught exception", e)
|
|
92
92
|
|
|
93
93
|
if returncode != 0:
|
|
94
94
|
raise pe.BashExitFailure(func_name, proc.returncode)
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import argparse
|
|
2
|
+
import concurrent.futures
|
|
3
|
+
import importlib
|
|
4
|
+
import time
|
|
5
|
+
from typing import Any, Dict, Literal
|
|
6
|
+
|
|
7
|
+
import parsl
|
|
8
|
+
from parsl.dataflow.dflow import DataFlowKernel
|
|
9
|
+
from parsl.errors import InternalConsistencyError
|
|
10
|
+
|
|
11
|
+
VALID_NAMED_ITERATION_MODES = ("estimate", "exponential")
|
|
12
|
+
|
|
13
|
+
min_iterations = 2
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
# TODO: factor with conftest.py where this is copy/pasted from?
|
|
17
|
+
def load_dfk_from_config(filename: str) -> DataFlowKernel:
|
|
18
|
+
spec = importlib.util.spec_from_file_location('', filename)
|
|
19
|
+
|
|
20
|
+
if spec is None:
|
|
21
|
+
raise RuntimeError("Could not import configuration")
|
|
22
|
+
|
|
23
|
+
module = importlib.util.module_from_spec(spec)
|
|
24
|
+
|
|
25
|
+
if spec.loader is None:
|
|
26
|
+
raise RuntimeError("Could not load configuration")
|
|
27
|
+
|
|
28
|
+
spec.loader.exec_module(module)
|
|
29
|
+
|
|
30
|
+
module = importlib.util.module_from_spec(spec)
|
|
31
|
+
spec.loader.exec_module(module)
|
|
32
|
+
|
|
33
|
+
if hasattr(module, 'config'):
|
|
34
|
+
return parsl.load(module.config)
|
|
35
|
+
elif hasattr(module, 'fresh_config'):
|
|
36
|
+
return parsl.load(module.fresh_config())
|
|
37
|
+
else:
|
|
38
|
+
raise RuntimeError("Config module does not define config or fresh_config")
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
@parsl.python_app
|
|
42
|
+
def app(extra_payload: Any, parsl_resource_specification: Dict = {}) -> int:
|
|
43
|
+
return 7
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def performance(*, resources: dict, target_t: float, args_extra_size: int, iterate_mode: str | list[int]) -> None:
|
|
47
|
+
|
|
48
|
+
delta_t: float
|
|
49
|
+
|
|
50
|
+
iteration = 1
|
|
51
|
+
|
|
52
|
+
args_extra_payload = "x" * args_extra_size
|
|
53
|
+
|
|
54
|
+
if isinstance(iterate_mode, list):
|
|
55
|
+
n = iterate_mode[0]
|
|
56
|
+
else:
|
|
57
|
+
n = 10
|
|
58
|
+
|
|
59
|
+
iterate = True
|
|
60
|
+
|
|
61
|
+
while iterate:
|
|
62
|
+
print(f"==== Iteration {iteration} ====")
|
|
63
|
+
print(f"Will run {n} tasks")
|
|
64
|
+
start_t = time.time()
|
|
65
|
+
|
|
66
|
+
fs = []
|
|
67
|
+
print("Submitting tasks / invoking apps")
|
|
68
|
+
for _ in range(n):
|
|
69
|
+
fs.append(app(args_extra_payload, parsl_resource_specification=resources))
|
|
70
|
+
|
|
71
|
+
submitted_t = time.time()
|
|
72
|
+
print(f"All {n} tasks submitted ... waiting for completion")
|
|
73
|
+
print(f"Submission took {submitted_t - start_t:.3f} seconds = {n / (submitted_t - start_t):.3f} tasks/second")
|
|
74
|
+
|
|
75
|
+
for f in concurrent.futures.as_completed(fs):
|
|
76
|
+
assert f.result() == 7
|
|
77
|
+
|
|
78
|
+
end_t = time.time()
|
|
79
|
+
|
|
80
|
+
delta_t = end_t - start_t
|
|
81
|
+
|
|
82
|
+
rate = n / delta_t
|
|
83
|
+
|
|
84
|
+
print(f"Runtime: actual {delta_t:.3f}s vs target {target_t}s")
|
|
85
|
+
print(f"Tasks per second: {rate:.3f}")
|
|
86
|
+
|
|
87
|
+
iteration += 1
|
|
88
|
+
|
|
89
|
+
# decide upon next iteration
|
|
90
|
+
|
|
91
|
+
match iterate_mode:
|
|
92
|
+
case "estimate":
|
|
93
|
+
n = max(1, int(target_t * rate))
|
|
94
|
+
iterate = delta_t < (0.75 * target_t) or iteration <= min_iterations
|
|
95
|
+
case "exponential":
|
|
96
|
+
n = int(n * 2)
|
|
97
|
+
iterate = delta_t < target_t or iteration <= min_iterations
|
|
98
|
+
case seq if isinstance(seq, list) and iteration <= len(seq):
|
|
99
|
+
n = seq[iteration - 1]
|
|
100
|
+
iterate = True
|
|
101
|
+
case seq if isinstance(seq, list):
|
|
102
|
+
iterate = False
|
|
103
|
+
case _:
|
|
104
|
+
raise InternalConsistencyError(f"Bad iterate mode {iterate_mode} - should have been validated at arg parse time")
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def validate_int_list(v: str) -> list[int] | Literal[False]:
|
|
108
|
+
try:
|
|
109
|
+
return list(map(int, v.split(",")))
|
|
110
|
+
except ValueError:
|
|
111
|
+
return False
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def iteration_mode(v: str) -> str | list[int]:
|
|
115
|
+
match v:
|
|
116
|
+
case s if s in VALID_NAMED_ITERATION_MODES:
|
|
117
|
+
return s
|
|
118
|
+
case _ if seq := validate_int_list(v):
|
|
119
|
+
return seq
|
|
120
|
+
case _:
|
|
121
|
+
raise argparse.ArgumentTypeError(f"Invalid iteration mode: {v}")
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def cli_run() -> None:
|
|
125
|
+
parser = argparse.ArgumentParser(
|
|
126
|
+
prog="parsl-perf",
|
|
127
|
+
description="Measure performance of Parsl configurations",
|
|
128
|
+
epilog="""
|
|
129
|
+
Example usage: python -m parsl.benchmark.perf --config parsl/tests/configs/workqueue_blocks.py --resources '{"cores":1, "memory":0, "disk":0}'
|
|
130
|
+
""")
|
|
131
|
+
|
|
132
|
+
parser.add_argument("--config", required=True, help="path to Python file that defines a configuration")
|
|
133
|
+
parser.add_argument("--resources", metavar="EXPR", help="parsl_resource_specification dictionary")
|
|
134
|
+
parser.add_argument("--time", metavar="SECONDS", help="target number of seconds for an iteration", default=120, type=float)
|
|
135
|
+
parser.add_argument("--argsize", metavar="BYTES", help="extra bytes to add into app invocation arguments", default=0, type=int)
|
|
136
|
+
parser.add_argument("--version", action="version", version=f"parsl-perf from Parsl {parsl.__version__}")
|
|
137
|
+
parser.add_argument("--iterate",
|
|
138
|
+
metavar="MODE",
|
|
139
|
+
help="Iteration mode: " + ", ".join(VALID_NAMED_ITERATION_MODES) + ", or sequence of explicit sizes",
|
|
140
|
+
type=iteration_mode,
|
|
141
|
+
default="estimate")
|
|
142
|
+
|
|
143
|
+
args = parser.parse_args()
|
|
144
|
+
|
|
145
|
+
if args.resources:
|
|
146
|
+
resources = eval(args.resources)
|
|
147
|
+
else:
|
|
148
|
+
resources = {}
|
|
149
|
+
|
|
150
|
+
with load_dfk_from_config(args.config):
|
|
151
|
+
performance(resources=resources, target_t=args.time, args_extra_size=args.argsize, iterate_mode=args.iterate)
|
|
152
|
+
print("Tests complete - leaving DFK block")
|
|
153
|
+
print("The end")
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
if __name__ == "__main__":
|
|
157
|
+
cli_run()
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
"""Interfaces modeled after Python's `concurrent library <https://docs.python.org/3/library/concurrent.html>`_"""
|
|
2
|
+
import time
|
|
3
|
+
from concurrent.futures import Executor
|
|
4
|
+
from contextlib import AbstractContextManager
|
|
5
|
+
from typing import Callable, Dict, Iterable, Iterator, Literal, Optional
|
|
6
|
+
from warnings import warn
|
|
7
|
+
|
|
8
|
+
from parsl import Config, DataFlowKernel, load
|
|
9
|
+
from parsl.app.python import PythonApp
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class ParslPoolExecutor(Executor, AbstractContextManager):
|
|
13
|
+
"""An executor that uses a pool of workers managed by Parsl
|
|
14
|
+
|
|
15
|
+
Works just like a :class:`~concurrent.futures.ProcessPoolExecutor` except that tasks
|
|
16
|
+
are distributed across workers that can be on different machines.
|
|
17
|
+
|
|
18
|
+
Create a new executor using one of two methods:
|
|
19
|
+
|
|
20
|
+
1. Supplying a Parsl :class:`~parsl.Config` that defines how to create new workers.
|
|
21
|
+
The executor will start a new Parsl Data Flow Kernel (DFK) when it is entered as a context manager.
|
|
22
|
+
|
|
23
|
+
2. Supplying an already-started Parsl :class:`~parsl.DataFlowKernel` (DFK).
|
|
24
|
+
The executor assumes you will start and stop the Parsl DFK outside the Executor.
|
|
25
|
+
|
|
26
|
+
The futures returned by :meth:`submit` and :meth:`map` are Parsl futures and will work
|
|
27
|
+
with the same function chaining mechanisms as when using Parsl with decorators.
|
|
28
|
+
|
|
29
|
+
.. code-block:: python
|
|
30
|
+
|
|
31
|
+
def f(x):
|
|
32
|
+
return x + 1
|
|
33
|
+
|
|
34
|
+
@python_app
|
|
35
|
+
def parity(x):
|
|
36
|
+
return 'odd' if x % 2 == 1 else 'even'
|
|
37
|
+
|
|
38
|
+
with ParslPoolExecutor(config=my_parsl_config) as executor:
|
|
39
|
+
future_1 = executor.submit(f, 1)
|
|
40
|
+
assert parity(future_1) == 'even' # Function chaining, as expected
|
|
41
|
+
|
|
42
|
+
future_2 = executor.submit(f, future_1)
|
|
43
|
+
assert future_2.result() == 3 # Chaining works with `submit` too
|
|
44
|
+
|
|
45
|
+
Parsl does not support canceling tasks. The :meth:`map` method does not cancel work
|
|
46
|
+
when one member of the run fails or a timeout is reached
|
|
47
|
+
and :meth:`shutdown` does not cancel work on completion.
|
|
48
|
+
"""
|
|
49
|
+
|
|
50
|
+
def __init__(self, config: Config | None = None, dfk: DataFlowKernel | None = None, executors: Literal['all'] | list[str] = 'all'):
|
|
51
|
+
"""Create the executor
|
|
52
|
+
|
|
53
|
+
Args:
|
|
54
|
+
config: Configuration for the Parsl Data Flow Kernel (DFK)
|
|
55
|
+
dfk: DataFlowKernel of an already-started parsl
|
|
56
|
+
executors: List of executors to use for supplied functions
|
|
57
|
+
"""
|
|
58
|
+
if (config is not None) and (dfk is not None):
|
|
59
|
+
raise ValueError('Specify only one of config or dfk')
|
|
60
|
+
if (config is None) and (dfk is None):
|
|
61
|
+
raise ValueError('Must specify one of config or dfk')
|
|
62
|
+
self._config = config
|
|
63
|
+
self._app_cache: Dict[Callable, PythonApp] = {} # Cache specific to this instance: https://stackoverflow.com/questions/33672412
|
|
64
|
+
self._dfk = dfk
|
|
65
|
+
self.executors = executors
|
|
66
|
+
|
|
67
|
+
# Start workers immediately
|
|
68
|
+
if self._config is not None:
|
|
69
|
+
self._dfk = load(self._config)
|
|
70
|
+
|
|
71
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
72
|
+
if self._dfk is None: # Nothing has been started, do nothing
|
|
73
|
+
return
|
|
74
|
+
elif self._config is not None: # The executors are being managed by this class, shut them down
|
|
75
|
+
self.shutdown(wait=True)
|
|
76
|
+
return
|
|
77
|
+
else: # The DFK is managed elsewhere, do nothing
|
|
78
|
+
return
|
|
79
|
+
|
|
80
|
+
@property
|
|
81
|
+
def app_count(self):
|
|
82
|
+
"""Number of functions currently registered with the executor"""
|
|
83
|
+
return len(self._app_cache)
|
|
84
|
+
|
|
85
|
+
def get_app(self, fn: Callable) -> PythonApp:
|
|
86
|
+
"""Create a PythonApp for a function
|
|
87
|
+
|
|
88
|
+
Args:
|
|
89
|
+
fn: Function to be turned into a Parsl app
|
|
90
|
+
Returns:
|
|
91
|
+
PythonApp version of that function
|
|
92
|
+
"""
|
|
93
|
+
if fn in self._app_cache:
|
|
94
|
+
return self._app_cache[fn]
|
|
95
|
+
app = PythonApp(fn, data_flow_kernel=self._dfk, executors=self.executors)
|
|
96
|
+
self._app_cache[fn] = app
|
|
97
|
+
return app
|
|
98
|
+
|
|
99
|
+
def submit(self, fn, *args, **kwargs):
|
|
100
|
+
"""Submits a callable to be executed with the given arguments.
|
|
101
|
+
|
|
102
|
+
Schedules the callable to be executed as ``fn(*args, **kwargs)`` and returns
|
|
103
|
+
a Future instance representing the execution of the callable.
|
|
104
|
+
|
|
105
|
+
Returns:
|
|
106
|
+
A Future representing the given call.
|
|
107
|
+
"""
|
|
108
|
+
|
|
109
|
+
if self._dfk is None:
|
|
110
|
+
raise RuntimeError('Executor has been shut down.')
|
|
111
|
+
app = self.get_app(fn)
|
|
112
|
+
return app(*args, **kwargs)
|
|
113
|
+
|
|
114
|
+
# TODO (wardlt): This override can go away when Parsl supports cancel
|
|
115
|
+
def map(self, fn: Callable, *iterables: Iterable, timeout: Optional[float] = None, chunksize: int = 1) -> Iterator:
|
|
116
|
+
"""Returns an iterator equivalent to map(fn, iter).
|
|
117
|
+
|
|
118
|
+
Args:
|
|
119
|
+
fn: A callable that will take as many arguments as there are
|
|
120
|
+
passed iterables.
|
|
121
|
+
timeout: The maximum number of seconds to wait. If None, then there
|
|
122
|
+
is no limit on the wait time.
|
|
123
|
+
chunksize: If greater than one, the iterables will be chopped into
|
|
124
|
+
chunks of size chunksize and submitted to the process pool.
|
|
125
|
+
If set to one, the items in the list will be sent one at a time.
|
|
126
|
+
|
|
127
|
+
Returns:
|
|
128
|
+
An iterator equivalent to: map(func, ``*iterables``) but the calls may
|
|
129
|
+
be evaluated out-of-order.
|
|
130
|
+
|
|
131
|
+
Raises:
|
|
132
|
+
TimeoutError: If the entire result iterator could not be generated
|
|
133
|
+
before the given timeout.
|
|
134
|
+
Exception: If ``fn(*args)`` raises for any values.
|
|
135
|
+
"""
|
|
136
|
+
# This is a version of the CPython 3.9 `.map` implementation modified to not use `cancel`
|
|
137
|
+
if timeout is not None:
|
|
138
|
+
end_time = timeout + time.monotonic()
|
|
139
|
+
|
|
140
|
+
# Submit the applications
|
|
141
|
+
app = self.get_app(fn)
|
|
142
|
+
fs = [app(*args) for args in zip(*iterables)]
|
|
143
|
+
|
|
144
|
+
# Yield the futures as completed
|
|
145
|
+
def result_iterator():
|
|
146
|
+
# reverse to keep finishing order
|
|
147
|
+
fs.reverse()
|
|
148
|
+
while fs:
|
|
149
|
+
# Careful not to keep a reference to the popped future
|
|
150
|
+
if timeout is None:
|
|
151
|
+
yield fs.pop().result()
|
|
152
|
+
else:
|
|
153
|
+
yield fs.pop().result(end_time - time.monotonic())
|
|
154
|
+
|
|
155
|
+
return result_iterator()
|
|
156
|
+
|
|
157
|
+
def shutdown(self, wait: bool = True, *, cancel_futures: bool = False) -> None:
|
|
158
|
+
if self._dfk is None:
|
|
159
|
+
return # Do nothing. Nothing is active
|
|
160
|
+
if cancel_futures:
|
|
161
|
+
warn(message="Canceling on-going tasks is not supported in Parsl")
|
|
162
|
+
if wait:
|
|
163
|
+
self._dfk.wait_for_current_tasks()
|
|
164
|
+
if self._config is not None: # The executors are being managed
|
|
165
|
+
self._dfk.cleanup() # Shutdown the DFK
|
|
166
|
+
self._dfk = None
|
|
@@ -101,17 +101,6 @@ class BaseContext(metaclass=ABCMeta):
|
|
|
101
101
|
"""
|
|
102
102
|
self._ctx.destroy(linger)
|
|
103
103
|
|
|
104
|
-
def recreate(self, linger: Optional[int] = None):
|
|
105
|
-
"""Destroy then recreate the context.
|
|
106
|
-
|
|
107
|
-
Parameters
|
|
108
|
-
----------
|
|
109
|
-
linger : int, optional
|
|
110
|
-
If specified, set LINGER on sockets prior to closing them.
|
|
111
|
-
"""
|
|
112
|
-
self.destroy(linger)
|
|
113
|
-
self._ctx = zmq.Context()
|
|
114
|
-
|
|
115
104
|
|
|
116
105
|
class ServerContext(BaseContext):
|
|
117
106
|
"""CurveZMQ server context
|
|
@@ -175,11 +164,6 @@ class ServerContext(BaseContext):
|
|
|
175
164
|
self.auth_thread.stop()
|
|
176
165
|
super().destroy(linger)
|
|
177
166
|
|
|
178
|
-
def recreate(self, linger: Optional[int] = None):
|
|
179
|
-
super().recreate(linger)
|
|
180
|
-
if self.auth_thread:
|
|
181
|
-
self.auth_thread = self._start_auth_thread()
|
|
182
|
-
|
|
183
167
|
|
|
184
168
|
class ClientContext(BaseContext):
|
|
185
169
|
"""CurveZMQ client context
|
|
@@ -4,7 +4,6 @@ import os
|
|
|
4
4
|
from functools import partial
|
|
5
5
|
from typing import Optional
|
|
6
6
|
|
|
7
|
-
import globus_sdk
|
|
8
7
|
import typeguard
|
|
9
8
|
|
|
10
9
|
import parsl
|
|
@@ -79,6 +78,7 @@ class Globus:
|
|
|
79
78
|
|
|
80
79
|
@classmethod
|
|
81
80
|
def transfer_file(cls, src_ep, dst_ep, src_path, dst_path):
|
|
81
|
+
import globus_sdk
|
|
82
82
|
tc = globus_sdk.TransferClient(authorizer=cls.authorizer)
|
|
83
83
|
td = globus_sdk.TransferData(tc, src_ep, dst_ep)
|
|
84
84
|
td.add_item(src_path, dst_path)
|
|
@@ -140,6 +140,7 @@ class Globus:
|
|
|
140
140
|
def _do_native_app_authentication(cls, client_id, redirect_uri,
|
|
141
141
|
requested_scopes=None):
|
|
142
142
|
|
|
143
|
+
import globus_sdk
|
|
143
144
|
client = globus_sdk.NativeAppAuthClient(client_id=client_id)
|
|
144
145
|
client.oauth2_start_flow(
|
|
145
146
|
requested_scopes=requested_scopes,
|
|
@@ -154,6 +155,7 @@ class Globus:
|
|
|
154
155
|
|
|
155
156
|
@classmethod
|
|
156
157
|
def _get_native_app_authorizer(cls, client_id):
|
|
158
|
+
import globus_sdk
|
|
157
159
|
tokens = None
|
|
158
160
|
try:
|
|
159
161
|
tokens = cls._load_tokens_from_file(cls.TOKEN_FILE)
|