parsl 2025.10.20__tar.gz → 2025.10.27__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of parsl might be problematic. Click here for more details.
- {parsl-2025.10.20/parsl.egg-info → parsl-2025.10.27}/PKG-INFO +3 -2
- parsl-2025.10.27/parsl/concurrent/__init__.py +166 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/data_provider/globus.py +3 -1
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/dataflow/dflow.py +5 -5
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/high_throughput/interchange.py +4 -7
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/local_threads_globus.py +18 -14
- parsl-2025.10.27/parsl/tests/sites/test_concurrent.py +96 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_priority_queue.py +1 -1
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_basic.py +0 -14
- parsl-2025.10.27/parsl/tests/test_python_apps/test_exception.py +19 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_staging/test_staging_globus.py +2 -2
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/unit/test_globus_compute_executor.py +11 -2
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/version.py +1 -1
- {parsl-2025.10.20 → parsl-2025.10.27/parsl.egg-info}/PKG-INFO +3 -2
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl.egg-info/SOURCES.txt +1 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl.egg-info/requires.txt +4 -1
- {parsl-2025.10.20 → parsl-2025.10.27}/requirements.txt +0 -1
- {parsl-2025.10.20 → parsl-2025.10.27}/setup.py +1 -0
- parsl-2025.10.20/parsl/concurrent/__init__.py +0 -85
- parsl-2025.10.20/parsl/tests/sites/test_concurrent.py +0 -48
- {parsl-2025.10.20 → parsl-2025.10.27}/LICENSE +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/MANIFEST.in +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/README.rst +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/addresses.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/app/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/app/app.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/app/bash.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/app/errors.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/app/futures.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/app/python.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/benchmark/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/benchmark/perf.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/config.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/ASPIRE1.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/Azure.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/anvil.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/bridges.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/cc_in2p3.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/delta.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/ec2.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/expanse.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/frontera.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/gc_multisite.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/gc_tutorial.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/htex_local.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/illinoiscluster.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/improv.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/kubernetes.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/local_threads.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/midway.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/osg.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/polaris.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/stampede2.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/summit.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/toss3_llnl.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/vineex_local.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/wqex_local.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/curvezmq.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/data_provider/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/data_provider/data_manager.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/data_provider/file_noop.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/data_provider/files.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/data_provider/ftp.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/data_provider/http.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/data_provider/rsync.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/data_provider/staging.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/data_provider/zip.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/dataflow/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/dataflow/dependency_resolvers.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/dataflow/errors.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/dataflow/futures.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/dataflow/memoization.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/dataflow/rundirs.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/dataflow/states.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/dataflow/taskrecord.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/errors.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/base.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/errors.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/execute_task.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/flux/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/flux/execute_parsl_task.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/flux/executor.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/flux/flux_instance_manager.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/globus_compute.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/high_throughput/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/high_throughput/errors.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/high_throughput/executor.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/high_throughput/manager_record.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/high_throughput/manager_selector.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/high_throughput/monitoring_info.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/high_throughput/mpi_executor.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/high_throughput/mpi_prefix_composer.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/high_throughput/mpi_resource_management.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/high_throughput/probe.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/high_throughput/process_worker_pool.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/high_throughput/zmq_pipes.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/radical/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/radical/executor.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/radical/rpex_resources.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/radical/rpex_worker.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/status_handling.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/taskvine/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/taskvine/errors.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/taskvine/exec_parsl_function.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/taskvine/executor.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/taskvine/factory.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/taskvine/factory_config.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/taskvine/manager.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/taskvine/manager_config.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/taskvine/utils.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/threads.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/workqueue/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/workqueue/errors.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/workqueue/exec_parsl_function.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/workqueue/executor.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/workqueue/parsl_coprocess.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/jobs/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/jobs/error_handlers.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/jobs/errors.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/jobs/job_status_poller.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/jobs/states.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/jobs/strategy.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/launchers/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/launchers/base.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/launchers/errors.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/launchers/launchers.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/log_utils.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/db_manager.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/errors.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/message_type.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/monitoring.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/queries/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/queries/pandas.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/radios/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/radios/base.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/radios/filesystem.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/radios/filesystem_router.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/radios/htex.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/radios/multiprocessing.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/radios/udp.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/radios/udp_router.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/radios/zmq.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/radios/zmq_router.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/remote.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/types.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/app.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/models.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/plots/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/plots/default/workflow_plots.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/templates/app.html +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/templates/dag.html +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/templates/error.html +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/templates/layout.html +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/templates/task.html +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/templates/workflow.html +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/utils.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/version.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/views.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/multiprocessing.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/process_loggers.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/aws/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/aws/aws.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/aws/template.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/azure/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/azure/azure.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/azure/template.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/base.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/cluster_provider.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/condor/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/condor/condor.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/condor/template.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/errors.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/googlecloud/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/googlecloud/googlecloud.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/grid_engine/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/grid_engine/grid_engine.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/grid_engine/template.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/kubernetes/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/kubernetes/kube.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/kubernetes/template.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/local/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/local/local.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/lsf/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/lsf/lsf.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/lsf/template.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/pbspro/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/pbspro/pbspro.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/pbspro/template.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/slurm/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/slurm/slurm.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/slurm/template.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/torque/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/torque/template.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/torque/torque.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/py.typed +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/serialize/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/serialize/base.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/serialize/concretes.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/serialize/errors.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/serialize/facade.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/serialize/proxystore.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/callables_helper.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/azure_single_node.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/bluewaters.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/bridges.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/cc_in2p3.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/comet.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/ec2_single_node.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/ec2_spot.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/flux_local.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/frontera.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/globus_compute.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/htex_local.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/htex_local_alternate.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/htex_local_intask_staging.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/htex_local_rsync_staging.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/local_radical.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/local_radical_mpi.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/local_threads.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/midway.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/nscc_singapore.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/osg_htex.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/petrelkube.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/slurm_local.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/summit.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/taskvine_ex.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/user_opts.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/workqueue_ex.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/conftest.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/integration/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/integration/latency.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/integration/test_apps/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/integration/test_stress/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/manual_tests/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/manual_tests/htex_local.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/manual_tests/test_basic.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/manual_tests/test_log_filter.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/manual_tests/test_memory_limits.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/manual_tests/test_regression_220.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/manual_tests/test_worker_count.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/site_tests/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/site_tests/site_config_selector.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/sites/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/sites/test_affinity.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/sites/test_dynamic_executor.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/sites/test_ec2.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/sites/test_launchers.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/sites/test_mpi/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/sites/test_worker_info.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_bash_apps/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_bash_apps/test_basic.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_bash_apps/test_inputs_default.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_bash_apps/test_memoize.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_bash_apps/test_multiline.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_bash_apps/test_pipeline.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_bash_apps/test_std_uri.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_bash_apps/test_stdout.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_callables.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_checkpointing/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_checkpointing/test_periodic.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_checkpointing/test_regression_233.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_checkpointing/test_task_exit.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_curvezmq.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_docs/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_docs/test_from_slides.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_docs/test_kwargs.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_docs/test_workflow1.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_docs/test_workflow4.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_error_handling/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_error_handling/test_fail.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_error_handling/test_python_walltime.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_error_handling/test_resource_spec.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_error_handling/test_retries.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_execute_task.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_flowcontrol/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_flux.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_basic.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_block_manager_selector_unit.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_command_client_timeout.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_command_concurrency_regression_1321.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_connected_blocks.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_cpu_affinity_explicit.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_disconnected_blocks.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_disconnected_blocks_failing_provider.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_drain.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_htex.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_interchange_exit_bad_registration.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_manager_failure.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_manager_selector_by_block.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_managers_command.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_missing_worker.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_multiple_disconnected_blocks.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_resource_spec_validation.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_worker_failure.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_zmq_binding.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_monitoring/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_monitoring/test_app_names.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_monitoring/test_basic.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_monitoring/test_exit_helper.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_monitoring/test_htex_fuzz_zmq.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_monitoring/test_incomplete_futures.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_monitoring/test_memoization_representation.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_monitoring/test_radio_filesystem.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_monitoring/test_radio_multiprocessing.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_monitoring/test_radio_udp.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_monitoring/test_radio_zmq.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_monitoring/test_stdouterr.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_mpi_apps/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_mpi_apps/test_bad_mpi_config.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_mpi_apps/test_mpi_prefix.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_mpi_apps/test_mpi_scheduler.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_mpi_apps/test_mpiex.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_mpi_apps/test_resource_spec.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_providers/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_providers/test_kubernetes_provider.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_providers/test_local_provider.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_providers/test_pbspro_template.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_providers/test_slurm_instantiate.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_providers/test_slurm_template.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_providers/test_submiterror_deprecation.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_context_manager.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_dep_standard_futures.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_dependencies_deep.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_depfail_propagation.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_fail.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_futures.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_garbage_collect.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_inputs_default.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_join.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_lifted.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_mapred.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_memoize_2.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_memoize_exception.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_outputs.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_overview.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_pipeline.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_pluggable_future_resolution.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_simple.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_timeout.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_type5.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_radical/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_radical/test_mpi_funcs.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_regression/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_regression/test_1480.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_regression/test_1653.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_regression/test_221.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_regression/test_226.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_regression/test_2652.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_regression/test_3874.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_regression/test_69a.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_regression/test_97_parallelism_0.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_regression/test_98.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_scaling/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_scaling/test_block_error_handler.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_scaling/test_regression_1621.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_scaling/test_regression_3568_scaledown_vs_MISSING.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_scaling/test_regression_3696_oscillation.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_scaling/test_scale_down.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_scaling/test_shutdown_scalein.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_scaling/test_worker_interchange_bad_messages_3262.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_serialization/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_serialization/test_2555_caching_deserializer.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_serialization/test_3495_deserialize_managerlost.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_serialization/test_basic.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_serialization/test_htex_code_cache.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_serialization/test_proxystore_configured.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_serialization/test_proxystore_impl.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_shutdown/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_shutdown/test_kill_monitoring.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_staging/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_staging/staging_provider.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_staging/test_1316.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_staging/test_docs_1.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_staging/test_docs_2.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_staging/test_file.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_staging/test_file_apps.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_staging/test_file_staging.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_staging/test_output_chain_filenames.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_staging/test_staging_https.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_staging/test_staging_stdout.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_staging/test_zip_in.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_staging/test_zip_out.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_staging/test_zip_to_zip.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_summary.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_thread_parallelism.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_threads/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_threads/test_configs.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_utils/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_utils/test_execute_wait.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_utils/test_logutils.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_utils/test_representation_mixin.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_utils/test_sanitize_dns.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/unit/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/unit/test_address.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/unit/test_file.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/unit/test_usage_tracking.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/utils.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/usage_tracking/__init__.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/usage_tracking/api.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/usage_tracking/levels.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/usage_tracking/usage.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl/utils.py +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl.egg-info/dependency_links.txt +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl.egg-info/entry_points.txt +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/parsl.egg-info/top_level.txt +0 -0
- {parsl-2025.10.20 → parsl-2025.10.27}/setup.cfg +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: parsl
|
|
3
|
-
Version: 2025.10.
|
|
3
|
+
Version: 2025.10.27
|
|
4
4
|
Summary: Simple data dependent workflows in Python
|
|
5
5
|
Home-page: https://github.com/Parsl/parsl
|
|
6
|
-
Download-URL: https://github.com/Parsl/parsl/archive/2025.10.
|
|
6
|
+
Download-URL: https://github.com/Parsl/parsl/archive/2025.10.27.tar.gz
|
|
7
7
|
Author: The Parsl Team
|
|
8
8
|
Author-email: parsl@googlegroups.com
|
|
9
9
|
License: Apache 2.0
|
|
@@ -28,6 +28,7 @@ Provides-Extra: flux
|
|
|
28
28
|
Provides-Extra: proxystore
|
|
29
29
|
Provides-Extra: radical-pilot
|
|
30
30
|
Provides-Extra: globus_compute
|
|
31
|
+
Provides-Extra: globus_transfer
|
|
31
32
|
Provides-Extra: all
|
|
32
33
|
License-File: LICENSE
|
|
33
34
|
|
|
@@ -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
|
|
@@ -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)
|
|
@@ -190,7 +190,7 @@ class DataFlowKernel:
|
|
|
190
190
|
self.tasks: Dict[int, TaskRecord] = {}
|
|
191
191
|
self.submitter_lock = threading.Lock()
|
|
192
192
|
|
|
193
|
-
self.
|
|
193
|
+
self._task_launch_pool = cf.ThreadPoolExecutor(max_workers=1, thread_name_prefix="Task-Launch")
|
|
194
194
|
|
|
195
195
|
self.dependency_resolver = self.config.dependency_resolver if self.config.dependency_resolver is not None \
|
|
196
196
|
else SHALLOW_DEPENDENCY_RESOLVER
|
|
@@ -608,7 +608,7 @@ class DataFlowKernel:
|
|
|
608
608
|
launch_if_ready is thread safe, so may be called from any thread
|
|
609
609
|
or callback.
|
|
610
610
|
"""
|
|
611
|
-
self.
|
|
611
|
+
self._task_launch_pool.submit(self._launch_if_ready_async, task_record)
|
|
612
612
|
|
|
613
613
|
@wrap_with_logs
|
|
614
614
|
def _launch_if_ready_async(self, task_record: TaskRecord) -> None:
|
|
@@ -1203,9 +1203,9 @@ class DataFlowKernel:
|
|
|
1203
1203
|
self.monitoring.close()
|
|
1204
1204
|
logger.info("Terminated monitoring")
|
|
1205
1205
|
|
|
1206
|
-
logger.info("Terminating
|
|
1207
|
-
self.
|
|
1208
|
-
logger.info("Terminated
|
|
1206
|
+
logger.info("Terminating task launch pool")
|
|
1207
|
+
self._task_launch_pool.shutdown()
|
|
1208
|
+
logger.info("Terminated task launch pool")
|
|
1209
1209
|
|
|
1210
1210
|
logger.info("Unregistering atexit hook")
|
|
1211
1211
|
atexit.unregister(self.atexit_cleanup)
|
|
@@ -138,9 +138,6 @@ class Interchange:
|
|
|
138
138
|
|
|
139
139
|
self.pending_task_queue: SortedList[Any] = SortedList(key=lambda tup: (tup[0], tup[1]))
|
|
140
140
|
|
|
141
|
-
# count of tasks that have been received from the submit side
|
|
142
|
-
self.task_counter = 0
|
|
143
|
-
|
|
144
141
|
# count of tasks that have been sent out to worker pools
|
|
145
142
|
self.count = 0
|
|
146
143
|
|
|
@@ -332,15 +329,15 @@ class Interchange:
|
|
|
332
329
|
msg = self.task_incoming.recv_pyobj()
|
|
333
330
|
|
|
334
331
|
# Process priority, higher number = lower priority
|
|
332
|
+
task_id = msg['task_id']
|
|
335
333
|
resource_spec = msg['context'].get('resource_spec', {})
|
|
336
334
|
priority = resource_spec.get('priority', float('inf'))
|
|
337
|
-
queue_entry = (-priority, -
|
|
335
|
+
queue_entry = (-priority, -task_id, msg)
|
|
338
336
|
|
|
339
|
-
logger.debug("
|
|
337
|
+
logger.debug("Putting task %s onto pending_task_queue", task_id)
|
|
340
338
|
|
|
341
339
|
self.pending_task_queue.add(queue_entry)
|
|
342
|
-
|
|
343
|
-
logger.debug(f"Fetched {self.task_counter} tasks so far")
|
|
340
|
+
logger.debug("Put task %s onto pending_task_queue", task_id)
|
|
344
341
|
|
|
345
342
|
def process_manager_socket_message(
|
|
346
343
|
self,
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
from parsl.config import Config
|
|
2
2
|
from parsl.data_provider.data_manager import default_staging
|
|
3
|
-
from parsl.data_provider.globus import GlobusStaging
|
|
4
3
|
from parsl.executors.threads import ThreadPoolExecutor
|
|
5
4
|
|
|
6
5
|
# If you are a developer running tests, make sure to update parsl/tests/configs/user_opts.py
|
|
@@ -10,19 +9,24 @@ from parsl.executors.threads import ThreadPoolExecutor
|
|
|
10
9
|
# (i.e., user_opts['swan']['username'] -> 'your_username')
|
|
11
10
|
from .user_opts import user_opts
|
|
12
11
|
|
|
13
|
-
storage_access = default_staging + [GlobusStaging(
|
|
14
|
-
endpoint_uuid=user_opts['globus']['endpoint'],
|
|
15
|
-
endpoint_path=user_opts['globus']['path']
|
|
16
|
-
)]
|
|
17
12
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
13
|
+
def fresh_config():
|
|
14
|
+
from parsl.data_provider.globus import GlobusStaging
|
|
15
|
+
|
|
16
|
+
storage_access = default_staging + [GlobusStaging(
|
|
17
|
+
endpoint_uuid=user_opts['globus']['endpoint'],
|
|
18
|
+
endpoint_path=user_opts['globus']['path']
|
|
19
|
+
)]
|
|
20
|
+
|
|
21
|
+
return Config(
|
|
22
|
+
executors=[
|
|
23
|
+
ThreadPoolExecutor(
|
|
24
|
+
label='local_threads_globus',
|
|
25
|
+
working_dir=user_opts['globus']['path'],
|
|
26
|
+
storage_access=storage_access
|
|
27
|
+
)
|
|
28
|
+
]
|
|
29
|
+
)
|
|
30
|
+
|
|
27
31
|
|
|
28
32
|
remote_writeable = user_opts['globus']['remote_writeable']
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
"""Tests of the interfaces to Python's concurrent library"""
|
|
2
|
+
from pytest import mark, raises, warns
|
|
3
|
+
|
|
4
|
+
from parsl import Config, HighThroughputExecutor, load, python_app
|
|
5
|
+
from parsl.concurrent import ParslPoolExecutor
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def f(x):
|
|
9
|
+
return x + 1
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def g(x):
|
|
13
|
+
return 2 * x
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@python_app
|
|
17
|
+
def is_odd(x):
|
|
18
|
+
if x % 2 == 1:
|
|
19
|
+
return 1
|
|
20
|
+
else:
|
|
21
|
+
return 0
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def make_config():
|
|
25
|
+
return Config(
|
|
26
|
+
executors=[
|
|
27
|
+
HighThroughputExecutor(
|
|
28
|
+
label='test_executor',
|
|
29
|
+
address="127.0.0.1",
|
|
30
|
+
max_workers_per_node=2,
|
|
31
|
+
heartbeat_period=2,
|
|
32
|
+
heartbeat_threshold=4,
|
|
33
|
+
encrypted=False,
|
|
34
|
+
)
|
|
35
|
+
],
|
|
36
|
+
strategy='none',
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@mark.local
|
|
41
|
+
def test_init_errors():
|
|
42
|
+
with load(make_config()) as dfk, raises(ValueError, match='Specify only one of config or dfk'):
|
|
43
|
+
ParslPoolExecutor(config=make_config(), dfk=dfk)
|
|
44
|
+
|
|
45
|
+
with raises(ValueError, match='Must specify one of config or dfk'):
|
|
46
|
+
ParslPoolExecutor()
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
@mark.local
|
|
50
|
+
def test_executor():
|
|
51
|
+
my_config = make_config()
|
|
52
|
+
|
|
53
|
+
with ParslPoolExecutor(my_config) as exc:
|
|
54
|
+
# Test a single submit
|
|
55
|
+
future = exc.submit(f, 1)
|
|
56
|
+
assert future.result() == 2
|
|
57
|
+
|
|
58
|
+
# Make sure the map works
|
|
59
|
+
results = list(exc.map(f, [1, 2, 3]))
|
|
60
|
+
assert results == [2, 3, 4]
|
|
61
|
+
|
|
62
|
+
# Make sure map works with a timeout
|
|
63
|
+
results = list(exc.map(f, [1, 2, 3], timeout=5))
|
|
64
|
+
assert results == [2, 3, 4]
|
|
65
|
+
|
|
66
|
+
# Make sure only one function was registered
|
|
67
|
+
assert exc.app_count == 1
|
|
68
|
+
|
|
69
|
+
with raises(RuntimeError, match='shut down'):
|
|
70
|
+
exc.submit(f, 1)
|
|
71
|
+
|
|
72
|
+
with warns(UserWarning):
|
|
73
|
+
ParslPoolExecutor(make_config()).shutdown(False, cancel_futures=True)
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
@mark.local
|
|
77
|
+
def test_with_dfk():
|
|
78
|
+
config = make_config()
|
|
79
|
+
|
|
80
|
+
with load(config) as dfk, ParslPoolExecutor(dfk=dfk, executors=['test_executor']) as exc:
|
|
81
|
+
future = exc.submit(f, 1)
|
|
82
|
+
assert future.result() == 2
|
|
83
|
+
assert exc.get_app(f).executors == ['test_executor']
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
@mark.local
|
|
87
|
+
def test_chaining():
|
|
88
|
+
"""Make sure the executor functions can be chained together"""
|
|
89
|
+
config = make_config()
|
|
90
|
+
|
|
91
|
+
with ParslPoolExecutor(config) as exc:
|
|
92
|
+
future_odd = exc.submit(f, 10)
|
|
93
|
+
assert is_odd(future_odd).result()
|
|
94
|
+
|
|
95
|
+
future_even = exc.submit(g, future_odd)
|
|
96
|
+
assert not is_odd(future_even).result()
|
|
@@ -61,7 +61,7 @@ def test_priority_queue(try_assert):
|
|
|
61
61
|
with open(htex.worker_logdir + "/interchange.log", "r") as f:
|
|
62
62
|
lines = f.readlines()
|
|
63
63
|
for line in lines:
|
|
64
|
-
if f"
|
|
64
|
+
if f"Put task {n} onto pending_task_queue" in line:
|
|
65
65
|
return True
|
|
66
66
|
return False
|
|
67
67
|
|
|
@@ -14,12 +14,6 @@ def import_square(x):
|
|
|
14
14
|
return math.pow(x, 2)
|
|
15
15
|
|
|
16
16
|
|
|
17
|
-
@python_app
|
|
18
|
-
def custom_exception():
|
|
19
|
-
from globus_sdk import GlobusError
|
|
20
|
-
raise GlobusError('foobar')
|
|
21
|
-
|
|
22
|
-
|
|
23
17
|
def test_simple(n=2):
|
|
24
18
|
x = double(n)
|
|
25
19
|
assert x.result() == n * 2
|
|
@@ -38,11 +32,3 @@ def test_parallel_for(n):
|
|
|
38
32
|
|
|
39
33
|
for i in d:
|
|
40
34
|
assert d[i].result() == 2 * i
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
def test_custom_exception():
|
|
44
|
-
from globus_sdk import GlobusError
|
|
45
|
-
|
|
46
|
-
x = custom_exception()
|
|
47
|
-
with pytest.raises(GlobusError):
|
|
48
|
-
x.result()
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import pytest
|
|
2
|
+
|
|
3
|
+
from parsl.app.app import python_app
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class CustomException(Exception):
|
|
7
|
+
pass
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@python_app
|
|
11
|
+
def custom_exception():
|
|
12
|
+
from parsl.tests.test_python_apps.test_exception import CustomException
|
|
13
|
+
raise CustomException('foobar')
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def test_custom_exception():
|
|
17
|
+
x = custom_exception()
|
|
18
|
+
with pytest.raises(CustomException):
|
|
19
|
+
x.result()
|
|
@@ -3,9 +3,9 @@ import pytest
|
|
|
3
3
|
import parsl
|
|
4
4
|
from parsl.app.app import python_app
|
|
5
5
|
from parsl.data_provider.files import File
|
|
6
|
-
from parsl.tests.configs.local_threads_globus import
|
|
6
|
+
from parsl.tests.configs.local_threads_globus import fresh_config, remote_writeable
|
|
7
7
|
|
|
8
|
-
local_config =
|
|
8
|
+
local_config = fresh_config
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
@python_app
|
|
@@ -2,18 +2,21 @@ import random
|
|
|
2
2
|
from unittest import mock
|
|
3
3
|
|
|
4
4
|
import pytest
|
|
5
|
-
from globus_compute_sdk import Executor
|
|
6
5
|
|
|
7
6
|
from parsl.executors import GlobusComputeExecutor
|
|
8
7
|
|
|
9
8
|
|
|
10
9
|
@pytest.fixture
|
|
11
10
|
def mock_ex():
|
|
12
|
-
# Not Parsl's job to test GC's Executor
|
|
11
|
+
# Not Parsl's job to test GC's Executor, although it
|
|
12
|
+
# still needs to be importable for these test cases.
|
|
13
|
+
from globus_compute_sdk import Executor
|
|
14
|
+
|
|
13
15
|
yield mock.Mock(spec=Executor)
|
|
14
16
|
|
|
15
17
|
|
|
16
18
|
@pytest.mark.local
|
|
19
|
+
@pytest.mark.globus_compute
|
|
17
20
|
def test_gc_executor_mock_spec(mock_ex):
|
|
18
21
|
# a test of tests -- make sure we're using spec= in the mock
|
|
19
22
|
with pytest.raises(AttributeError):
|
|
@@ -21,12 +24,14 @@ def test_gc_executor_mock_spec(mock_ex):
|
|
|
21
24
|
|
|
22
25
|
|
|
23
26
|
@pytest.mark.local
|
|
27
|
+
@pytest.mark.globus_compute
|
|
24
28
|
def test_gc_executor_label_default(mock_ex):
|
|
25
29
|
gce = GlobusComputeExecutor(mock_ex)
|
|
26
30
|
assert gce.label == type(gce).__name__, "Expect reasonable default label"
|
|
27
31
|
|
|
28
32
|
|
|
29
33
|
@pytest.mark.local
|
|
34
|
+
@pytest.mark.globus_compute
|
|
30
35
|
def test_gc_executor_label(mock_ex, randomstring):
|
|
31
36
|
exp_label = randomstring()
|
|
32
37
|
gce = GlobusComputeExecutor(mock_ex, label=exp_label)
|
|
@@ -34,6 +39,7 @@ def test_gc_executor_label(mock_ex, randomstring):
|
|
|
34
39
|
|
|
35
40
|
|
|
36
41
|
@pytest.mark.local
|
|
42
|
+
@pytest.mark.globus_compute
|
|
37
43
|
def test_gc_executor_resets_spec_after_submit(mock_ex, randomstring):
|
|
38
44
|
submit_res = {randomstring(): "some submit res"}
|
|
39
45
|
res = {"some": randomstring(), "spec": randomstring()}
|
|
@@ -57,6 +63,7 @@ def test_gc_executor_resets_spec_after_submit(mock_ex, randomstring):
|
|
|
57
63
|
|
|
58
64
|
|
|
59
65
|
@pytest.mark.local
|
|
66
|
+
@pytest.mark.globus_compute
|
|
60
67
|
def test_gc_executor_resets_uep_after_submit(mock_ex, randomstring):
|
|
61
68
|
uep_conf = randomstring()
|
|
62
69
|
res = {"some": randomstring()}
|
|
@@ -79,6 +86,7 @@ def test_gc_executor_resets_uep_after_submit(mock_ex, randomstring):
|
|
|
79
86
|
|
|
80
87
|
|
|
81
88
|
@pytest.mark.local
|
|
89
|
+
@pytest.mark.globus_compute
|
|
82
90
|
def test_gc_executor_happy_path(mock_ex, randomstring):
|
|
83
91
|
mock_fn = mock.Mock()
|
|
84
92
|
args = tuple(randomstring() for _ in range(random.randint(0, 3)))
|
|
@@ -95,6 +103,7 @@ def test_gc_executor_happy_path(mock_ex, randomstring):
|
|
|
95
103
|
|
|
96
104
|
|
|
97
105
|
@pytest.mark.local
|
|
106
|
+
@pytest.mark.globus_compute
|
|
98
107
|
def test_gc_executor_shuts_down_asynchronously(mock_ex):
|
|
99
108
|
gce = GlobusComputeExecutor(mock_ex)
|
|
100
109
|
gce.shutdown()
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: parsl
|
|
3
|
-
Version: 2025.10.
|
|
3
|
+
Version: 2025.10.27
|
|
4
4
|
Summary: Simple data dependent workflows in Python
|
|
5
5
|
Home-page: https://github.com/Parsl/parsl
|
|
6
|
-
Download-URL: https://github.com/Parsl/parsl/archive/2025.10.
|
|
6
|
+
Download-URL: https://github.com/Parsl/parsl/archive/2025.10.27.tar.gz
|
|
7
7
|
Author: The Parsl Team
|
|
8
8
|
Author-email: parsl@googlegroups.com
|
|
9
9
|
License: Apache 2.0
|
|
@@ -28,6 +28,7 @@ Provides-Extra: flux
|
|
|
28
28
|
Provides-Extra: proxystore
|
|
29
29
|
Provides-Extra: radical-pilot
|
|
30
30
|
Provides-Extra: globus_compute
|
|
31
|
+
Provides-Extra: globus_transfer
|
|
31
32
|
Provides-Extra: all
|
|
32
33
|
License-File: LICENSE
|
|
33
34
|
|
|
@@ -370,6 +370,7 @@ parsl/tests/test_python_apps/test_dep_standard_futures.py
|
|
|
370
370
|
parsl/tests/test_python_apps/test_dependencies.py
|
|
371
371
|
parsl/tests/test_python_apps/test_dependencies_deep.py
|
|
372
372
|
parsl/tests/test_python_apps/test_depfail_propagation.py
|
|
373
|
+
parsl/tests/test_python_apps/test_exception.py
|
|
373
374
|
parsl/tests/test_python_apps/test_fail.py
|
|
374
375
|
parsl/tests/test_python_apps/test_fibonacci_iterative.py
|
|
375
376
|
parsl/tests/test_python_apps/test_fibonacci_recursive.py
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
pyzmq>=17.1.2
|
|
2
2
|
typeguard!=3.*,<5,>=2.10
|
|
3
3
|
typing-extensions<5,>=4.6
|
|
4
|
-
globus-sdk
|
|
5
4
|
dill
|
|
6
5
|
tblib
|
|
7
6
|
requests
|
|
@@ -38,6 +37,7 @@ proxystore
|
|
|
38
37
|
radical.pilot==1.90
|
|
39
38
|
radical.utils==1.90
|
|
40
39
|
globus_compute_sdk>=2.34.0
|
|
40
|
+
globus-sdk
|
|
41
41
|
|
|
42
42
|
[aws]
|
|
43
43
|
boto3
|
|
@@ -60,6 +60,9 @@ jsonschema
|
|
|
60
60
|
[globus_compute]
|
|
61
61
|
globus_compute_sdk>=2.34.0
|
|
62
62
|
|
|
63
|
+
[globus_transfer]
|
|
64
|
+
globus-sdk
|
|
65
|
+
|
|
63
66
|
[google_cloud]
|
|
64
67
|
google-auth
|
|
65
68
|
google-api-python-client
|
|
@@ -46,6 +46,7 @@ extras_require = {
|
|
|
46
46
|
'proxystore': ['proxystore'],
|
|
47
47
|
'radical-pilot': ['radical.pilot==1.90', 'radical.utils==1.90'],
|
|
48
48
|
'globus_compute': ['globus_compute_sdk>=2.34.0'],
|
|
49
|
+
'globus_transfer': ['globus-sdk'],
|
|
49
50
|
# Disabling psi-j since github direct links are not allowed by pypi
|
|
50
51
|
# 'psij': ['psi-j-parsl@git+https://github.com/ExaWorks/psi-j-parsl']
|
|
51
52
|
}
|