parsl 2025.9.22__tar.gz → 2025.10.6__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.

Files changed (467) hide show
  1. {parsl-2025.9.22/parsl.egg-info → parsl-2025.10.6}/PKG-INFO +3 -4
  2. {parsl-2025.9.22 → parsl-2025.10.6}/README.rst +5 -2
  3. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/benchmark/perf.py +22 -9
  4. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/dataflow/dflow.py +6 -4
  5. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/dataflow/memoization.py +9 -19
  6. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/high_throughput/executor.py +76 -20
  7. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/high_throughput/interchange.py +4 -3
  8. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/high_throughput/mpi_executor.py +1 -2
  9. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/high_throughput/mpi_resource_management.py +3 -4
  10. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/high_throughput/process_worker_pool.py +25 -4
  11. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/high_throughput/zmq_pipes.py +7 -24
  12. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/taskvine/executor.py +5 -1
  13. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/taskvine_ex.py +1 -1
  14. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_checkpointing/test_periodic.py +15 -9
  15. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_checkpointing/test_regression_233.py +0 -1
  16. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_htex.py +36 -1
  17. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_interchange_exit_bad_registration.py +0 -1
  18. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_mpi_apps/test_mpi_scheduler.py +12 -12
  19. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_garbage_collect.py +1 -6
  20. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_memoize_2.py +11 -1
  21. parsl-2025.10.6/parsl/tests/test_regression/test_3874.py +47 -0
  22. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/version.py +1 -1
  23. {parsl-2025.9.22 → parsl-2025.10.6/parsl.egg-info}/PKG-INFO +3 -4
  24. {parsl-2025.9.22 → parsl-2025.10.6}/parsl.egg-info/SOURCES.txt +1 -2
  25. {parsl-2025.9.22 → parsl-2025.10.6}/setup.py +1 -2
  26. parsl-2025.9.22/parsl/tests/configs/local_threads_checkpoint_periodic.py +0 -11
  27. parsl-2025.9.22/parsl/tests/configs/local_threads_no_cache.py +0 -11
  28. {parsl-2025.9.22 → parsl-2025.10.6}/LICENSE +0 -0
  29. {parsl-2025.9.22 → parsl-2025.10.6}/MANIFEST.in +0 -0
  30. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/__init__.py +0 -0
  31. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/addresses.py +0 -0
  32. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/app/__init__.py +0 -0
  33. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/app/app.py +0 -0
  34. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/app/bash.py +0 -0
  35. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/app/errors.py +0 -0
  36. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/app/futures.py +0 -0
  37. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/app/python.py +0 -0
  38. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/benchmark/__init__.py +0 -0
  39. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/concurrent/__init__.py +0 -0
  40. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/config.py +0 -0
  41. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/ASPIRE1.py +0 -0
  42. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/Azure.py +0 -0
  43. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/__init__.py +0 -0
  44. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/anvil.py +0 -0
  45. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/bridges.py +0 -0
  46. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/cc_in2p3.py +0 -0
  47. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/delta.py +0 -0
  48. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/ec2.py +0 -0
  49. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/expanse.py +0 -0
  50. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/frontera.py +0 -0
  51. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/gc_multisite.py +0 -0
  52. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/gc_tutorial.py +0 -0
  53. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/htex_local.py +0 -0
  54. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/illinoiscluster.py +0 -0
  55. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/improv.py +0 -0
  56. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/kubernetes.py +0 -0
  57. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/local_threads.py +0 -0
  58. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/midway.py +0 -0
  59. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/osg.py +0 -0
  60. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/polaris.py +0 -0
  61. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/stampede2.py +0 -0
  62. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/summit.py +0 -0
  63. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/toss3_llnl.py +0 -0
  64. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/vineex_local.py +0 -0
  65. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/configs/wqex_local.py +0 -0
  66. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/curvezmq.py +0 -0
  67. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/data_provider/__init__.py +0 -0
  68. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/data_provider/data_manager.py +0 -0
  69. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/data_provider/file_noop.py +0 -0
  70. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/data_provider/files.py +0 -0
  71. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/data_provider/ftp.py +0 -0
  72. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/data_provider/globus.py +0 -0
  73. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/data_provider/http.py +0 -0
  74. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/data_provider/rsync.py +0 -0
  75. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/data_provider/staging.py +0 -0
  76. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/data_provider/zip.py +0 -0
  77. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/dataflow/__init__.py +0 -0
  78. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/dataflow/dependency_resolvers.py +0 -0
  79. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/dataflow/errors.py +0 -0
  80. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/dataflow/futures.py +0 -0
  81. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/dataflow/rundirs.py +0 -0
  82. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/dataflow/states.py +0 -0
  83. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/dataflow/taskrecord.py +0 -0
  84. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/errors.py +0 -0
  85. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/__init__.py +0 -0
  86. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/base.py +0 -0
  87. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/errors.py +0 -0
  88. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/execute_task.py +0 -0
  89. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/flux/__init__.py +0 -0
  90. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/flux/execute_parsl_task.py +0 -0
  91. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/flux/executor.py +0 -0
  92. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/flux/flux_instance_manager.py +0 -0
  93. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/globus_compute.py +0 -0
  94. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/high_throughput/__init__.py +0 -0
  95. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/high_throughput/errors.py +0 -0
  96. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/high_throughput/manager_record.py +0 -0
  97. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/high_throughput/manager_selector.py +0 -0
  98. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/high_throughput/monitoring_info.py +0 -0
  99. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/high_throughput/mpi_prefix_composer.py +0 -0
  100. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/high_throughput/probe.py +0 -0
  101. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/radical/__init__.py +0 -0
  102. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/radical/executor.py +0 -0
  103. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/radical/rpex_resources.py +0 -0
  104. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/radical/rpex_worker.py +0 -0
  105. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/status_handling.py +0 -0
  106. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/taskvine/__init__.py +0 -0
  107. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/taskvine/errors.py +0 -0
  108. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/taskvine/exec_parsl_function.py +0 -0
  109. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/taskvine/factory.py +0 -0
  110. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/taskvine/factory_config.py +0 -0
  111. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/taskvine/manager.py +0 -0
  112. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/taskvine/manager_config.py +0 -0
  113. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/taskvine/utils.py +0 -0
  114. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/threads.py +0 -0
  115. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/workqueue/__init__.py +0 -0
  116. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/workqueue/errors.py +0 -0
  117. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/workqueue/exec_parsl_function.py +0 -0
  118. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/workqueue/executor.py +0 -0
  119. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/workqueue/parsl_coprocess.py +0 -0
  120. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
  121. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/jobs/__init__.py +0 -0
  122. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/jobs/error_handlers.py +0 -0
  123. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/jobs/errors.py +0 -0
  124. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/jobs/job_status_poller.py +0 -0
  125. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/jobs/states.py +0 -0
  126. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/jobs/strategy.py +0 -0
  127. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/launchers/__init__.py +0 -0
  128. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/launchers/base.py +0 -0
  129. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/launchers/errors.py +0 -0
  130. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/launchers/launchers.py +0 -0
  131. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/log_utils.py +0 -0
  132. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/__init__.py +0 -0
  133. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/db_manager.py +0 -0
  134. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/errors.py +0 -0
  135. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/message_type.py +0 -0
  136. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/monitoring.py +0 -0
  137. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/queries/__init__.py +0 -0
  138. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/queries/pandas.py +0 -0
  139. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/radios/__init__.py +0 -0
  140. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/radios/base.py +0 -0
  141. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/radios/filesystem.py +0 -0
  142. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/radios/filesystem_router.py +0 -0
  143. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/radios/htex.py +0 -0
  144. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/radios/multiprocessing.py +0 -0
  145. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/radios/udp.py +0 -0
  146. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/radios/udp_router.py +0 -0
  147. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/radios/zmq.py +0 -0
  148. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/radios/zmq_router.py +0 -0
  149. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/remote.py +0 -0
  150. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/types.py +0 -0
  151. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/__init__.py +0 -0
  152. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/app.py +0 -0
  153. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/models.py +0 -0
  154. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/plots/__init__.py +0 -0
  155. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
  156. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
  157. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/plots/default/workflow_plots.py +0 -0
  158. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +0 -0
  159. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
  160. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
  161. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/templates/app.html +0 -0
  162. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/templates/dag.html +0 -0
  163. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/templates/error.html +0 -0
  164. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/templates/layout.html +0 -0
  165. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
  166. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/templates/task.html +0 -0
  167. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/templates/workflow.html +0 -0
  168. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
  169. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/utils.py +0 -0
  170. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/version.py +0 -0
  171. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/monitoring/visualization/views.py +0 -0
  172. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/multiprocessing.py +0 -0
  173. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/process_loggers.py +0 -0
  174. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/__init__.py +0 -0
  175. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/aws/__init__.py +0 -0
  176. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/aws/aws.py +0 -0
  177. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/aws/template.py +0 -0
  178. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/azure/__init__.py +0 -0
  179. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/azure/azure.py +0 -0
  180. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/azure/template.py +0 -0
  181. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/base.py +0 -0
  182. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/cluster_provider.py +0 -0
  183. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/condor/__init__.py +0 -0
  184. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/condor/condor.py +0 -0
  185. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/condor/template.py +0 -0
  186. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/errors.py +0 -0
  187. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/googlecloud/__init__.py +0 -0
  188. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/googlecloud/googlecloud.py +0 -0
  189. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/grid_engine/__init__.py +0 -0
  190. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/grid_engine/grid_engine.py +0 -0
  191. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/grid_engine/template.py +0 -0
  192. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/kubernetes/__init__.py +0 -0
  193. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/kubernetes/kube.py +0 -0
  194. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/kubernetes/template.py +0 -0
  195. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/local/__init__.py +0 -0
  196. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/local/local.py +0 -0
  197. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/lsf/__init__.py +0 -0
  198. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/lsf/lsf.py +0 -0
  199. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/lsf/template.py +0 -0
  200. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/pbspro/__init__.py +0 -0
  201. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/pbspro/pbspro.py +0 -0
  202. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/pbspro/template.py +0 -0
  203. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/slurm/__init__.py +0 -0
  204. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/slurm/slurm.py +0 -0
  205. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/slurm/template.py +0 -0
  206. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/torque/__init__.py +0 -0
  207. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/torque/template.py +0 -0
  208. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/providers/torque/torque.py +0 -0
  209. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/py.typed +0 -0
  210. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/serialize/__init__.py +0 -0
  211. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/serialize/base.py +0 -0
  212. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/serialize/concretes.py +0 -0
  213. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/serialize/errors.py +0 -0
  214. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/serialize/facade.py +0 -0
  215. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/serialize/proxystore.py +0 -0
  216. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/__init__.py +0 -0
  217. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/callables_helper.py +0 -0
  218. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/__init__.py +0 -0
  219. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/azure_single_node.py +0 -0
  220. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/bluewaters.py +0 -0
  221. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/bridges.py +0 -0
  222. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/cc_in2p3.py +0 -0
  223. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/comet.py +0 -0
  224. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/ec2_single_node.py +0 -0
  225. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/ec2_spot.py +0 -0
  226. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/flux_local.py +0 -0
  227. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/frontera.py +0 -0
  228. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/globus_compute.py +0 -0
  229. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/htex_local.py +0 -0
  230. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/htex_local_alternate.py +0 -0
  231. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/htex_local_intask_staging.py +0 -0
  232. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/htex_local_rsync_staging.py +0 -0
  233. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/local_radical.py +0 -0
  234. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/local_radical_mpi.py +0 -0
  235. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/local_threads.py +0 -0
  236. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
  237. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
  238. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
  239. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
  240. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/local_threads_globus.py +0 -0
  241. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
  242. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/midway.py +0 -0
  243. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/nscc_singapore.py +0 -0
  244. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/osg_htex.py +0 -0
  245. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/petrelkube.py +0 -0
  246. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/slurm_local.py +0 -0
  247. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/summit.py +0 -0
  248. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/user_opts.py +0 -0
  249. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/configs/workqueue_ex.py +0 -0
  250. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/conftest.py +0 -0
  251. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/integration/__init__.py +0 -0
  252. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/integration/latency.py +0 -0
  253. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/integration/test_apps/__init__.py +0 -0
  254. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
  255. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/integration/test_stress/__init__.py +0 -0
  256. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
  257. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
  258. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/manual_tests/__init__.py +0 -0
  259. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/manual_tests/htex_local.py +0 -0
  260. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/manual_tests/test_basic.py +0 -0
  261. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/manual_tests/test_log_filter.py +0 -0
  262. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/manual_tests/test_memory_limits.py +0 -0
  263. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/manual_tests/test_regression_220.py +0 -0
  264. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/manual_tests/test_worker_count.py +0 -0
  265. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/site_tests/__init__.py +0 -0
  266. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/site_tests/site_config_selector.py +0 -0
  267. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/sites/__init__.py +0 -0
  268. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/sites/test_affinity.py +0 -0
  269. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/sites/test_concurrent.py +0 -0
  270. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/sites/test_dynamic_executor.py +0 -0
  271. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/sites/test_ec2.py +0 -0
  272. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/sites/test_launchers.py +0 -0
  273. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/sites/test_mpi/__init__.py +0 -0
  274. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/sites/test_worker_info.py +0 -0
  275. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_bash_apps/__init__.py +0 -0
  276. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
  277. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_bash_apps/test_basic.py +0 -0
  278. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
  279. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_bash_apps/test_inputs_default.py +0 -0
  280. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
  281. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -0
  282. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_bash_apps/test_memoize.py +0 -0
  283. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
  284. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
  285. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_bash_apps/test_multiline.py +0 -0
  286. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_bash_apps/test_pipeline.py +0 -0
  287. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_bash_apps/test_std_uri.py +0 -0
  288. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_bash_apps/test_stdout.py +0 -0
  289. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_callables.py +0 -0
  290. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_checkpointing/__init__.py +0 -0
  291. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +0 -0
  292. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
  293. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
  294. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
  295. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_checkpointing/test_task_exit.py +0 -0
  296. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_curvezmq.py +0 -0
  297. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_docs/__init__.py +0 -0
  298. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_docs/test_from_slides.py +0 -0
  299. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_docs/test_kwargs.py +0 -0
  300. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
  301. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_docs/test_workflow1.py +0 -0
  302. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_docs/test_workflow4.py +0 -0
  303. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_error_handling/__init__.py +0 -0
  304. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_error_handling/test_fail.py +0 -0
  305. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_error_handling/test_python_walltime.py +0 -0
  306. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_error_handling/test_resource_spec.py +0 -0
  307. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_error_handling/test_retries.py +0 -0
  308. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
  309. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
  310. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
  311. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
  312. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_execute_task.py +0 -0
  313. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_flowcontrol/__init__.py +0 -0
  314. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_flux.py +0 -0
  315. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/__init__.py +0 -0
  316. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_basic.py +0 -0
  317. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_block_manager_selector_unit.py +0 -0
  318. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_command_client_timeout.py +0 -0
  319. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_command_concurrency_regression_1321.py +0 -0
  320. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_connected_blocks.py +0 -0
  321. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_cpu_affinity_explicit.py +0 -0
  322. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_disconnected_blocks.py +0 -0
  323. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_disconnected_blocks_failing_provider.py +0 -0
  324. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_drain.py +0 -0
  325. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_manager_failure.py +0 -0
  326. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_manager_selector_by_block.py +0 -0
  327. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_managers_command.py +0 -0
  328. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_missing_worker.py +0 -0
  329. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_multiple_disconnected_blocks.py +0 -0
  330. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_priority_queue.py +0 -0
  331. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_resource_spec_validation.py +0 -0
  332. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_worker_failure.py +0 -0
  333. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_htex/test_zmq_binding.py +0 -0
  334. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_monitoring/__init__.py +0 -0
  335. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_monitoring/test_app_names.py +0 -0
  336. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_monitoring/test_basic.py +0 -0
  337. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
  338. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_monitoring/test_exit_helper.py +0 -0
  339. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_monitoring/test_htex_fuzz_zmq.py +0 -0
  340. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +0 -0
  341. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_monitoring/test_incomplete_futures.py +0 -0
  342. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_monitoring/test_memoization_representation.py +0 -0
  343. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_monitoring/test_radio_filesystem.py +0 -0
  344. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_monitoring/test_radio_multiprocessing.py +0 -0
  345. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_monitoring/test_radio_udp.py +0 -0
  346. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_monitoring/test_radio_zmq.py +0 -0
  347. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_monitoring/test_stdouterr.py +0 -0
  348. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
  349. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_mpi_apps/__init__.py +0 -0
  350. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_mpi_apps/test_bad_mpi_config.py +0 -0
  351. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +0 -0
  352. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_mpi_apps/test_mpi_prefix.py +0 -0
  353. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_mpi_apps/test_mpiex.py +0 -0
  354. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_mpi_apps/test_resource_spec.py +0 -0
  355. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_providers/__init__.py +0 -0
  356. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_providers/test_kubernetes_provider.py +0 -0
  357. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_providers/test_local_provider.py +0 -0
  358. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_providers/test_pbspro_template.py +0 -0
  359. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_providers/test_slurm_instantiate.py +0 -0
  360. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_providers/test_slurm_template.py +0 -0
  361. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_providers/test_submiterror_deprecation.py +0 -0
  362. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/__init__.py +0 -0
  363. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
  364. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_basic.py +0 -0
  365. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_context_manager.py +0 -0
  366. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_dep_standard_futures.py +0 -0
  367. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
  368. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_dependencies_deep.py +0 -0
  369. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_depfail_propagation.py +0 -0
  370. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_fail.py +0 -0
  371. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
  372. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
  373. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_futures.py +0 -0
  374. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
  375. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_inputs_default.py +0 -0
  376. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_join.py +0 -0
  377. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_lifted.py +0 -0
  378. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_mapred.py +0 -0
  379. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
  380. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
  381. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +0 -0
  382. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_memoize_exception.py +0 -0
  383. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
  384. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
  385. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_outputs.py +0 -0
  386. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_overview.py +0 -0
  387. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_pipeline.py +0 -0
  388. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_pluggable_future_resolution.py +0 -0
  389. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_simple.py +0 -0
  390. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_timeout.py +0 -0
  391. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_python_apps/test_type5.py +0 -0
  392. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_radical/__init__.py +0 -0
  393. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_radical/test_mpi_funcs.py +0 -0
  394. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_regression/__init__.py +0 -0
  395. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_regression/test_1480.py +0 -0
  396. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +0 -0
  397. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_regression/test_1653.py +0 -0
  398. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_regression/test_221.py +0 -0
  399. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_regression/test_226.py +0 -0
  400. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_regression/test_2652.py +0 -0
  401. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_regression/test_69a.py +0 -0
  402. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_regression/test_97_parallelism_0.py +0 -0
  403. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_regression/test_98.py +0 -0
  404. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_scaling/__init__.py +0 -0
  405. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_scaling/test_block_error_handler.py +0 -0
  406. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_scaling/test_regression_1621.py +0 -0
  407. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_scaling/test_regression_3568_scaledown_vs_MISSING.py +0 -0
  408. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_scaling/test_regression_3696_oscillation.py +0 -0
  409. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_scaling/test_scale_down.py +0 -0
  410. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +0 -0
  411. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +0 -0
  412. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_scaling/test_shutdown_scalein.py +0 -0
  413. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_scaling/test_worker_interchange_bad_messages_3262.py +0 -0
  414. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_serialization/__init__.py +0 -0
  415. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_serialization/test_2555_caching_deserializer.py +0 -0
  416. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_serialization/test_3495_deserialize_managerlost.py +0 -0
  417. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_serialization/test_basic.py +0 -0
  418. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_serialization/test_htex_code_cache.py +0 -0
  419. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_serialization/test_proxystore_configured.py +0 -0
  420. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_serialization/test_proxystore_impl.py +0 -0
  421. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_shutdown/__init__.py +0 -0
  422. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_shutdown/test_kill_monitoring.py +0 -0
  423. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_staging/__init__.py +0 -0
  424. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_staging/staging_provider.py +0 -0
  425. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_staging/test_1316.py +0 -0
  426. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_staging/test_docs_1.py +0 -0
  427. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_staging/test_docs_2.py +0 -0
  428. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
  429. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_staging/test_file.py +0 -0
  430. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_staging/test_file_apps.py +0 -0
  431. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_staging/test_file_staging.py +0 -0
  432. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_staging/test_output_chain_filenames.py +0 -0
  433. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
  434. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
  435. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_staging/test_staging_globus.py +0 -0
  436. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_staging/test_staging_https.py +0 -0
  437. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_staging/test_staging_stdout.py +0 -0
  438. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_staging/test_zip_in.py +0 -0
  439. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_staging/test_zip_out.py +0 -0
  440. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_staging/test_zip_to_zip.py +0 -0
  441. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_summary.py +0 -0
  442. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_thread_parallelism.py +0 -0
  443. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_threads/__init__.py +0 -0
  444. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_threads/test_configs.py +0 -0
  445. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
  446. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_utils/__init__.py +0 -0
  447. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_utils/test_execute_wait.py +0 -0
  448. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_utils/test_logutils.py +0 -0
  449. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_utils/test_representation_mixin.py +0 -0
  450. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/test_utils/test_sanitize_dns.py +0 -0
  451. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/unit/__init__.py +0 -0
  452. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/unit/test_address.py +0 -0
  453. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/unit/test_file.py +0 -0
  454. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/unit/test_globus_compute_executor.py +0 -0
  455. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/unit/test_usage_tracking.py +0 -0
  456. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/tests/utils.py +0 -0
  457. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/usage_tracking/__init__.py +0 -0
  458. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/usage_tracking/api.py +0 -0
  459. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/usage_tracking/levels.py +0 -0
  460. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/usage_tracking/usage.py +0 -0
  461. {parsl-2025.9.22 → parsl-2025.10.6}/parsl/utils.py +0 -0
  462. {parsl-2025.9.22 → parsl-2025.10.6}/parsl.egg-info/dependency_links.txt +0 -0
  463. {parsl-2025.9.22 → parsl-2025.10.6}/parsl.egg-info/entry_points.txt +0 -0
  464. {parsl-2025.9.22 → parsl-2025.10.6}/parsl.egg-info/requires.txt +0 -0
  465. {parsl-2025.9.22 → parsl-2025.10.6}/parsl.egg-info/top_level.txt +0 -0
  466. {parsl-2025.9.22 → parsl-2025.10.6}/requirements.txt +0 -0
  467. {parsl-2025.9.22 → parsl-2025.10.6}/setup.cfg +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: parsl
3
- Version: 2025.9.22
3
+ Version: 2025.10.6
4
4
  Summary: Simple data dependent workflows in Python
5
5
  Home-page: https://github.com/Parsl/parsl
6
- Download-URL: https://github.com/Parsl/parsl/archive/2025.09.22.tar.gz
6
+ Download-URL: https://github.com/Parsl/parsl/archive/2025.10.06.tar.gz
7
7
  Author: The Parsl Team
8
8
  Author-email: parsl@googlegroups.com
9
9
  License: Apache 2.0
@@ -11,11 +11,10 @@ Keywords: Workflows,Scientific computing
11
11
  Classifier: Development Status :: 5 - Production/Stable
12
12
  Classifier: Intended Audience :: Developers
13
13
  Classifier: License :: OSI Approved :: Apache Software License
14
- Classifier: Programming Language :: Python :: 3.9
15
14
  Classifier: Programming Language :: Python :: 3.10
16
15
  Classifier: Programming Language :: Python :: 3.11
17
16
  Classifier: Programming Language :: Python :: 3.12
18
- Requires-Python: >=3.9.0
17
+ Requires-Python: >=3.10.0
19
18
  Provides-Extra: monitoring
20
19
  Provides-Extra: visualization
21
20
  Provides-Extra: aws
@@ -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.9+. Requirements can be found `here <requirements.txt>`_. Requirements for running tests can be found `here <test-requirements.txt>`_.
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
  ===============
@@ -2,32 +2,45 @@ import argparse
2
2
  import concurrent.futures
3
3
  import importlib
4
4
  import time
5
+ from typing import Any, Dict
5
6
 
6
7
  import parsl
8
+ from parsl.dataflow.dflow import DataFlowKernel
7
9
 
8
10
  min_iterations = 2
9
11
 
10
12
 
11
13
  # TODO: factor with conftest.py where this is copy/pasted from?
12
- def load_dfk_from_config(filename):
14
+ def load_dfk_from_config(filename: str) -> DataFlowKernel:
13
15
  spec = importlib.util.spec_from_file_location('', filename)
16
+
17
+ if spec is None:
18
+ raise RuntimeError("Could not import configuration")
19
+
20
+ module = importlib.util.module_from_spec(spec)
21
+
22
+ if spec.loader is None:
23
+ raise RuntimeError("Could not load configuration")
24
+
25
+ spec.loader.exec_module(module)
26
+
14
27
  module = importlib.util.module_from_spec(spec)
15
28
  spec.loader.exec_module(module)
16
29
 
17
30
  if hasattr(module, 'config'):
18
- parsl.load(module.config)
31
+ return parsl.load(module.config)
19
32
  elif hasattr(module, 'fresh_config'):
20
- parsl.load(module.fresh_config())
33
+ return parsl.load(module.fresh_config())
21
34
  else:
22
35
  raise RuntimeError("Config module does not define config or fresh_config")
23
36
 
24
37
 
25
38
  @parsl.python_app
26
- def app(extra_payload, parsl_resource_specification={}):
39
+ def app(extra_payload: Any, parsl_resource_specification: Dict = {}) -> int:
27
40
  return 7
28
41
 
29
42
 
30
- def performance(*, resources: dict, target_t: float, args_extra_size: int):
43
+ def performance(*, resources: dict, target_t: float, args_extra_size: int) -> None:
31
44
  n = 10
32
45
 
33
46
  delta_t: float
@@ -82,6 +95,7 @@ Example usage: python -m parsl.benchmark.perf --config parsl/tests/configs/workq
82
95
  parser.add_argument("--resources", metavar="EXPR", help="parsl_resource_specification dictionary")
83
96
  parser.add_argument("--time", metavar="SECONDS", help="target number of seconds for an iteration", default=120, type=float)
84
97
  parser.add_argument("--argsize", metavar="BYTES", help="extra bytes to add into app invocation arguments", default=0, type=int)
98
+ parser.add_argument("--version", action="version", version=f"parsl-perf from Parsl {parsl.__version__}")
85
99
 
86
100
  args = parser.parse_args()
87
101
 
@@ -90,10 +104,9 @@ Example usage: python -m parsl.benchmark.perf --config parsl/tests/configs/workq
90
104
  else:
91
105
  resources = {}
92
106
 
93
- load_dfk_from_config(args.config)
94
- performance(resources=resources, target_t=args.time, args_extra_size=args.argsize)
95
- print("Cleaning up DFK")
96
- parsl.dfk().cleanup()
107
+ with load_dfk_from_config(args.config):
108
+ performance(resources=resources, target_t=args.time, args_extra_size=args.argsize)
109
+ print("Tests complete - leaving DFK block")
97
110
  print("The end")
98
111
 
99
112
 
@@ -175,7 +175,7 @@ class DataFlowKernel:
175
175
  else:
176
176
  checkpoint_files = []
177
177
 
178
- self.memoizer = Memoizer(self, memoize=config.app_cache, checkpoint_files=checkpoint_files)
178
+ self.memoizer = Memoizer(memoize=config.app_cache, checkpoint_files=checkpoint_files)
179
179
  self.checkpointed_tasks = 0
180
180
  self._checkpoint_timer = None
181
181
  self.checkpoint_mode = config.checkpoint_mode
@@ -375,6 +375,7 @@ class DataFlowKernel:
375
375
  logger.info("Task {} failed due to dependency failure so skipping retries".format(task_id))
376
376
  task_record['time_returned'] = datetime.datetime.now()
377
377
  self._send_task_log_info(task_record)
378
+ self.memoizer.update_memo(task_record)
378
379
  with task_record['app_fu']._update_lock:
379
380
  task_record['app_fu'].set_exception(e)
380
381
 
@@ -400,6 +401,7 @@ class DataFlowKernel:
400
401
  self.update_task_state(task_record, States.failed)
401
402
  task_record['time_returned'] = datetime.datetime.now()
402
403
  self._send_task_log_info(task_record)
404
+ self.memoizer.update_memo(task_record)
403
405
  with task_record['app_fu']._update_lock:
404
406
  task_record['app_fu'].set_exception(e)
405
407
 
@@ -446,6 +448,7 @@ class DataFlowKernel:
446
448
  self.update_task_state(task_record, States.failed)
447
449
  task_record['time_returned'] = datetime.datetime.now()
448
450
  self._send_task_log_info(task_record)
451
+ self.memoizer.update_memo(task_record)
449
452
  with task_record['app_fu']._update_lock:
450
453
  task_record['app_fu'].set_exception(
451
454
  TypeError(f"join_app body must return a Future or list of Futures, got {joinable} of type {type(joinable)}"))
@@ -521,6 +524,7 @@ class DataFlowKernel:
521
524
 
522
525
  self.update_task_state(task_record, States.failed)
523
526
  task_record['time_returned'] = datetime.datetime.now()
527
+ self.memoizer.update_memo(task_record)
524
528
  with task_record['app_fu']._update_lock:
525
529
  task_record['app_fu'].set_exception(e)
526
530
 
@@ -561,8 +565,6 @@ class DataFlowKernel:
561
565
  if not task_record['app_fu'] == future:
562
566
  logger.error("Internal consistency error: callback future is not the app_fu in task structure, for task {}".format(task_id))
563
567
 
564
- self.memoizer.update_memo(task_record, future)
565
-
566
568
  # Cover all checkpointing cases here:
567
569
  # Do we need to checkpoint now, or queue for later,
568
570
  # or do nothing?
@@ -591,6 +593,7 @@ class DataFlowKernel:
591
593
  logger.info(f"Task {task_record['id']} completed ({old_state.name} -> {new_state.name})")
592
594
  task_record['time_returned'] = datetime.datetime.now()
593
595
 
596
+ self.memoizer.update_memo(task_record)
594
597
  with task_record['app_fu']._update_lock:
595
598
  task_record['app_fu'].set_result(result)
596
599
 
@@ -1202,7 +1205,6 @@ class DataFlowKernel:
1202
1205
 
1203
1206
  self.log_task_states()
1204
1207
 
1205
- # Checkpointing takes priority over the rest of the tasks
1206
1208
  # checkpoint if any valid checkpoint method is specified
1207
1209
  if self.checkpoint_mode is not None:
1208
1210
  self.checkpoint()
@@ -4,20 +4,16 @@ import hashlib
4
4
  import logging
5
5
  import os
6
6
  import pickle
7
+ import types
8
+ from concurrent.futures import Future
7
9
  from functools import lru_cache, singledispatch
8
- from typing import TYPE_CHECKING, Any, Dict, List, Optional, Sequence
10
+ from typing import Any, Dict, List, Optional, Sequence
9
11
 
10
12
  import typeguard
11
13
 
12
14
  from parsl.dataflow.errors import BadCheckpoint
13
15
  from parsl.dataflow.taskrecord import TaskRecord
14
16
 
15
- if TYPE_CHECKING:
16
- from parsl import DataFlowKernel # import loop at runtime - needed for typechecking - TODO turn into "if typing:"
17
-
18
- import types
19
- from concurrent.futures import Future
20
-
21
17
  logger = logging.getLogger(__name__)
22
18
 
23
19
 
@@ -150,17 +146,13 @@ class Memoizer:
150
146
 
151
147
  """
152
148
 
153
- def __init__(self, dfk: DataFlowKernel, *, memoize: bool = True, checkpoint_files: Sequence[str]):
149
+ def __init__(self, *, memoize: bool = True, checkpoint_files: Sequence[str]):
154
150
  """Initialize the memoizer.
155
151
 
156
- Args:
157
- - dfk (DFK obj): The DFK object
158
-
159
152
  KWargs:
160
153
  - memoize (Bool): enable memoization or not.
161
154
  - checkpoint (Dict): A checkpoint loaded as a dict.
162
155
  """
163
- self.dfk = dfk
164
156
  self.memoize = memoize
165
157
 
166
158
  checkpoint = self.load_checkpoints(checkpoint_files)
@@ -242,16 +234,14 @@ class Memoizer:
242
234
  assert isinstance(result, Future) or result is None
243
235
  return result
244
236
 
245
- def update_memo(self, task: TaskRecord, r: Future[Any]) -> None:
237
+ def update_memo(self, task: TaskRecord) -> None:
246
238
  """Updates the memoization lookup table with the result from a task.
239
+ This doesn't move any values around but associates the memoization
240
+ hashsum with the completed (by success or failure) AppFuture.
247
241
 
248
242
  Args:
249
- - task (dict) : A task dict from dfk.tasks
250
- - r (Result future): Result future
243
+ - task (TaskRecord) : A task record from dfk.tasks
251
244
  """
252
- # TODO: could use typeguard
253
- assert isinstance(r, Future)
254
-
255
245
  task_id = task['id']
256
246
 
257
247
  if not self.memoize or not task['memoize'] or 'hashsum' not in task:
@@ -265,7 +255,7 @@ class Memoizer:
265
255
  logger.info(f"Replacing app cache entry {task['hashsum']} with result from task {task_id}")
266
256
  else:
267
257
  logger.debug(f"Storing app cache entry {task['hashsum']} with result from task {task_id}")
268
- self.memo_lookup_table[task['hashsum']] = r
258
+ self.memo_lookup_table[task['hashsum']] = task['app_fu']
269
259
 
270
260
  def _load_checkpoints(self, checkpointDirs: Sequence[str]) -> Dict[str, Future[Any]]:
271
261
  """Load a checkpoint file into a lookup table.
@@ -160,6 +160,12 @@ GENERAL_HTEX_PARAM_DOCS = """provider : :class:`~parsl.providers.base.ExecutionP
160
160
  """ # Documentation for params used by both HTEx and MPIEx
161
161
 
162
162
 
163
+ class HTEXFuture(Future):
164
+ def __init__(self, task_id) -> None:
165
+ super().__init__()
166
+ self.parsl_executor_task_id = task_id
167
+
168
+
163
169
  class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageInformation):
164
170
  __doc__ = f"""Executor designed for cluster-scale
165
171
 
@@ -237,7 +243,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
237
243
  @typeguard.typechecked
238
244
  def __init__(self,
239
245
  label: str = 'HighThroughputExecutor',
240
- provider: ExecutionProvider = LocalProvider(),
246
+ provider: Optional[ExecutionProvider] = None,
241
247
  launch_cmd: Optional[str] = None,
242
248
  interchange_launch_cmd: Optional[Sequence[str]] = None,
243
249
  address: Optional[str] = None,
@@ -267,7 +273,9 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
267
273
 
268
274
  logger.debug("Initializing HighThroughputExecutor")
269
275
 
270
- BlockProviderExecutor.__init__(self, provider=provider, block_error_handler=block_error_handler)
276
+ BlockProviderExecutor.__init__(self,
277
+ provider=provider if provider else LocalProvider(),
278
+ block_error_handler=block_error_handler)
271
279
  self.label = label
272
280
  self.worker_debug = worker_debug
273
281
  self.storage_access = storage_access
@@ -501,10 +509,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
501
509
  else:
502
510
 
503
511
  for serialized_msg in msgs:
504
- try:
505
- msg = pickle.loads(serialized_msg)
506
- except pickle.UnpicklingError:
507
- raise BadMessage("Message received could not be unpickled")
512
+ msg = pickle.loads(serialized_msg)
508
513
 
509
514
  if msg['type'] == 'result':
510
515
  try:
@@ -671,7 +676,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
671
676
  logger.debug("Sending hold to manager: {}".format(manager['manager']))
672
677
  self._hold_manager(manager['manager'])
673
678
 
674
- def submit(self, func, resource_specification, *args, **kwargs):
679
+ def submit(self, func: Callable, resource_specification: dict, *args, **kwargs) -> HTEXFuture:
675
680
  """Submits work to the outgoing_q.
676
681
 
677
682
  The outgoing_q is an external process listens on this
@@ -692,32 +697,83 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
692
697
 
693
698
  self.validate_resource_spec(resource_specification)
694
699
 
695
- if self.bad_state_is_set:
696
- raise self.executor_exception
697
-
698
- self._task_counter += 1
699
- task_id = self._task_counter
700
-
701
700
  # handle people sending blobs gracefully
702
701
  if logger.getEffectiveLevel() <= logging.DEBUG:
703
702
  args_to_print = tuple([ar if len(ar := repr(arg)) < 100 else (ar[:100] + '...') for arg in args])
704
703
  logger.debug("Pushing function {} to queue with args {}".format(func, args_to_print))
705
704
 
706
- fut = Future()
707
- fut.parsl_executor_task_id = task_id
708
- self.tasks[task_id] = fut
709
-
710
705
  try:
711
706
  fn_buf = pack_apply_message(func, args, kwargs, buffer_threshold=1 << 20)
712
707
  except TypeError:
713
708
  raise SerializationError(func.__name__)
714
709
 
715
- msg = {"task_id": task_id, "resource_spec": resource_specification, "buffer": fn_buf}
710
+ context = {}
711
+ if resource_specification:
712
+ context["resource_spec"] = resource_specification
713
+
714
+ return self.submit_payload(context, fn_buf)
715
+
716
+ def submit_payload(self, context: dict, buffer: bytes) -> HTEXFuture:
717
+ """
718
+ Submit specially crafted payloads.
719
+
720
+ For use-cases where the ``HighThroughputExecutor`` consumer needs the payload
721
+ handled by the worker in a special way. For example, if the function is
722
+ serialized differently than Parsl's default approach, or if the task must
723
+ be setup more precisely than Parsl's default ``execute_task`` allows.
724
+
725
+ An example interaction:
726
+
727
+ .. code-block: python
728
+
729
+ >>> htex: HighThroughputExecutor # setup prior to this example
730
+ >>> ctxt = {
731
+ ... "task_executor": {
732
+ ... "f": "full.import.path.of.custom_execute_task",
733
+ ... "a": ("additional", "arguments"),
734
+ ... "k": {"some": "keyword", "args": "here"}
735
+ ... }
736
+ ... }
737
+ >>> fn_buf = custom_serialize(task_func, *task_args, **task_kwargs)
738
+ >>> fut = htex.submit_payload(ctxt, fn_buf)
739
+
740
+ The custom ``custom_execute_task`` would be dynamically imported, and
741
+ invoked as:
742
+
743
+ .. code-block: python
744
+
745
+ args = ("additional", "arguments")
746
+ kwargs = {"some": "keyword", "args": "here"}
747
+ result = custom_execute_task(fn_buf, *args, **kwargs)
748
+
749
+ Parameters
750
+ ----------
751
+ context:
752
+ A task-specific context associated with the function buffer. Parsl
753
+ currently implements the keys ``task_executor`` and ``resource_spec``
754
+
755
+ buffer:
756
+ A serialized function, that will be deserialized and executed by
757
+ ``execute_task`` (or custom function, if ``task_executor`` is specified)
758
+
759
+ Returns
760
+ -------
761
+ An HTEXFuture (a normal Future, with the attribute ``.parsl_executor_task_id``
762
+ set). The future will be set to done when the associated function buffer has
763
+ been invoked and completed.
764
+ """
765
+ if self.bad_state_is_set:
766
+ raise self.executor_exception
767
+
768
+ self._task_counter += 1
769
+ task_id = self._task_counter
770
+
771
+ fut = HTEXFuture(task_id)
772
+ self.tasks[task_id] = fut
716
773
 
717
- # Post task to the outgoing queue
774
+ msg = {"task_id": task_id, "context": context, "buffer": buffer}
718
775
  self.outgoing_q.put(msg)
719
776
 
720
- # Return the future
721
777
  return fut
722
778
 
723
779
  @property
@@ -332,7 +332,7 @@ class Interchange:
332
332
  msg = self.task_incoming.recv_pyobj()
333
333
 
334
334
  # Process priority, higher number = lower priority
335
- resource_spec = msg.get('resource_spec', {})
335
+ resource_spec = msg['context'].get('resource_spec', {})
336
336
  priority = resource_spec.get('priority', float('inf'))
337
337
  queue_entry = (-priority, -self.task_counter, msg)
338
338
 
@@ -360,9 +360,10 @@ class Interchange:
360
360
  mtype = meta['type']
361
361
  except Exception as e:
362
362
  logger.warning(
363
- f'Failed to read manager message ([{type(e).__name__}] {e})'
363
+ 'Failed to read manager message; ignoring message'
364
+ f' (Exception: [{type(e).__name__}] {e})'
364
365
  )
365
- logger.debug('Message:\n %r\n', msg_parts, exc_info=e)
366
+ logger.debug('Raw message bytes:\n %r\n', msg_parts, exc_info=e)
366
367
  return
367
368
 
368
369
  logger.debug(
@@ -16,7 +16,6 @@ from parsl.executors.status_handling import BlockProviderExecutor
16
16
  from parsl.jobs.states import JobStatus
17
17
  from parsl.launchers import SimpleLauncher
18
18
  from parsl.monitoring.radios.base import RadioConfig
19
- from parsl.providers import LocalProvider
20
19
  from parsl.providers.base import ExecutionProvider
21
20
 
22
21
 
@@ -47,7 +46,7 @@ class MPIExecutor(HighThroughputExecutor):
47
46
  @typeguard.typechecked
48
47
  def __init__(self,
49
48
  label: str = 'MPIExecutor',
50
- provider: ExecutionProvider = LocalProvider(),
49
+ provider: Optional[ExecutionProvider] = None,
51
50
  launch_cmd: Optional[str] = None,
52
51
  interchange_launch_cmd: Optional[str] = None,
53
52
  address: Optional[str] = None,
@@ -166,11 +166,10 @@ class MPITaskScheduler(TaskScheduler):
166
166
 
167
167
  def put_task(self, task_package: dict):
168
168
  """Schedule task if resources are available otherwise backlog the task"""
169
- resource_spec = task_package.get("resource_spec", {})
169
+ resource_spec = task_package.get("context", {}).get("resource_spec", {})
170
170
 
171
- nodes_needed = resource_spec.get("num_nodes")
172
- tid = task_package["task_id"]
173
- if nodes_needed:
171
+ if nodes_needed := resource_spec.get("num_nodes"):
172
+ tid = task_package["task_id"]
174
173
  try:
175
174
  allocated_nodes = self._get_nodes(nodes_needed)
176
175
  except MPINodesUnavailable:
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env python3
2
2
 
3
3
  import argparse
4
+ import importlib
4
5
  import logging
5
6
  import math
6
7
  import multiprocessing
@@ -17,7 +18,7 @@ from importlib.metadata import distributions
17
18
  from multiprocessing.context import SpawnProcess
18
19
  from multiprocessing.managers import DictProxy
19
20
  from multiprocessing.sharedctypes import Synchronized
20
- from typing import Dict, List, Optional, Sequence
21
+ from typing import Callable, Dict, List, Optional, Sequence
21
22
 
22
23
  import psutil
23
24
  import zmq
@@ -373,6 +374,8 @@ class Manager:
373
374
  if socks.get(ix_sock) == zmq.POLLIN:
374
375
  pkl_msg = ix_sock.recv()
375
376
  tasks = pickle.loads(pkl_msg)
377
+ del pkl_msg
378
+
376
379
  last_interchange_contact = time.time()
377
380
 
378
381
  if tasks == HEARTBEAT_CODE:
@@ -454,6 +457,7 @@ class Manager:
454
457
  'exception': serialize(RemoteExceptionWrapper(*sys.exc_info()))}
455
458
  pkl_package = pickle.dumps(result_package)
456
459
  self.pending_result_queue.put(pkl_package)
460
+ del pkl_package
457
461
  except KeyError:
458
462
  logger.info("Worker {} was not busy when it died".format(worker_id))
459
463
 
@@ -770,17 +774,33 @@ def worker(
770
774
  ready_worker_count.value -= 1
771
775
  worker_enqueued = False
772
776
 
773
- _init_mpi_env(mpi_launcher=mpi_launcher, resource_spec=req["resource_spec"])
777
+ ctxt = req["context"]
778
+ res_spec = ctxt.get("resource_spec", {})
779
+
780
+ _init_mpi_env(mpi_launcher=mpi_launcher, resource_spec=res_spec)
781
+
782
+ exec_func: Callable = execute_task
783
+ exec_args = ()
784
+ exec_kwargs = {}
774
785
 
775
786
  try:
776
- result = execute_task(req['buffer'])
787
+ if task_executor := ctxt.get("task_executor", None):
788
+ mod_name, _, fn_name = task_executor["f"].rpartition(".")
789
+ exec_mod = importlib.import_module(mod_name)
790
+ exec_func = getattr(exec_mod, fn_name)
791
+
792
+ exec_args = task_executor.get("a", ())
793
+ exec_kwargs = task_executor.get("k", {})
794
+
795
+ result = exec_func(req['buffer'], *exec_args, **exec_kwargs)
777
796
  serialized_result = serialize(result, buffer_threshold=1000000)
778
797
  except Exception as e:
779
798
  logger.info('Caught an exception: {}'.format(e))
780
799
  result_package = {'type': 'result', 'task_id': tid, 'exception': serialize(RemoteExceptionWrapper(*sys.exc_info()))}
781
800
  else:
782
801
  result_package = {'type': 'result', 'task_id': tid, 'result': serialized_result}
783
- # logger.debug("Result: {}".format(result))
802
+ del serialized_result
803
+ del req
784
804
 
785
805
  logger.info("Completed executor task {}".format(tid))
786
806
  try:
@@ -792,6 +812,7 @@ def worker(
792
812
  })
793
813
 
794
814
  result_queue.put(pkl_package)
815
+ del pkl_package, result_package
795
816
  tasks_in_progress.pop(worker_id)
796
817
  logger.info("All processing finished for executor task {}".format(tid))
797
818
 
@@ -136,30 +136,18 @@ class TasksOutgoing:
136
136
  self.port = self.zmq_socket.bind_to_random_port(tcp_url(ip_address),
137
137
  min_port=port_range[0],
138
138
  max_port=port_range[1])
139
- self.poller = zmq.Poller()
140
- self.poller.register(self.zmq_socket, zmq.POLLOUT)
141
139
 
142
140
  def put(self, message):
143
141
  """ This function needs to be fast at the same time aware of the possibility of
144
142
  ZMQ pipes overflowing.
145
143
 
146
- The timeout increases slowly if contention is detected on ZMQ pipes.
147
144
  We could set copy=False and get slightly better latency but this results
148
145
  in ZMQ sockets reaching a broken state once there are ~10k tasks in flight.
149
146
  This issue can be magnified if each the serialized buffer itself is larger.
150
147
  """
151
- timeout_ms = 1
152
- while True:
153
- socks = dict(self.poller.poll(timeout=timeout_ms))
154
- if self.zmq_socket in socks and socks[self.zmq_socket] == zmq.POLLOUT:
155
- # The copy option adds latency but reduces the risk of ZMQ overflow
156
- logger.debug("Sending TasksOutgoing message")
157
- self.zmq_socket.send_pyobj(message, copy=True)
158
- logger.debug("Sent TasksOutgoing message")
159
- return
160
- else:
161
- timeout_ms *= 2
162
- logger.debug("Not sending due to non-ready zmq pipe, timeout: {} ms".format(timeout_ms))
148
+ logger.debug("Sending TasksOutgoing message")
149
+ self.zmq_socket.send_pyobj(message)
150
+ logger.debug("Sent TasksOutgoing message")
163
151
 
164
152
  def close(self):
165
153
  self.zmq_socket.close()
@@ -192,20 +180,15 @@ class ResultsIncoming:
192
180
  self.port = self.results_receiver.bind_to_random_port(tcp_url(ip_address),
193
181
  min_port=port_range[0],
194
182
  max_port=port_range[1])
195
- self.poller = zmq.Poller()
196
- self.poller.register(self.results_receiver, zmq.POLLIN)
197
183
 
198
184
  def get(self, timeout_ms=None):
199
185
  """Get a message from the queue, returning None if timeout expires
200
186
  without a message. timeout is measured in milliseconds.
201
187
  """
202
- socks = dict(self.poller.poll(timeout=timeout_ms))
203
- if self.results_receiver in socks and socks[self.results_receiver] == zmq.POLLIN:
204
- m = self.results_receiver.recv_multipart()
205
- logger.debug("Received ResultsIncoming message")
206
- return m
207
- else:
208
- return None
188
+ if zmq.POLLIN == self.results_receiver.poll(timeout_ms, zmq.POLLIN):
189
+ logger.debug("Receiving ResultsIncoming multipart message")
190
+ return self.results_receiver.recv_multipart()
191
+ return None
209
192
 
210
193
  def close(self):
211
194
  self.results_receiver.close()
@@ -107,13 +107,17 @@ class TaskVineExecutor(BlockProviderExecutor, putils.RepresentationMixin):
107
107
  function_exec_mode: Union[Literal['regular'], Literal['serverless']] = 'regular',
108
108
  manager_config: TaskVineManagerConfig = TaskVineManagerConfig(),
109
109
  factory_config: TaskVineFactoryConfig = TaskVineFactoryConfig(),
110
- provider: Optional[ExecutionProvider] = LocalProvider(init_blocks=1),
110
+ provider: Optional[ExecutionProvider] = None,
111
111
  storage_access: Optional[List[Staging]] = None,
112
112
  remote_monitoring_radio: Optional[RadioConfig] = None):
113
113
 
114
114
  # Set worker launch option for this executor
115
115
  if worker_launch_method == 'factory' or worker_launch_method == 'manual':
116
116
  provider = None
117
+ elif worker_launch_method == 'provider' and provider is None:
118
+ # provider method chosen, but no explicit provider supplied to __init__
119
+ # so default to LocalProvider
120
+ provider = LocalProvider(init_blocks=1)
117
121
 
118
122
  # Initialize the parent class with the execution provider and block error handling enabled.
119
123
  # If provider is None, then no worker is launched via the provider method.
@@ -7,4 +7,4 @@ from parsl.executors.taskvine import TaskVineExecutor, TaskVineManagerConfig
7
7
 
8
8
  def fresh_config():
9
9
  return Config(executors=[TaskVineExecutor(manager_config=TaskVineManagerConfig(port=9000),
10
- worker_launch_method='factory')])
10
+ worker_launch_method='provider')])