parsl 2025.9.29__tar.gz → 2025.10.13__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of parsl might be problematic. Click here for more details.

Files changed (466) hide show
  1. {parsl-2025.9.29/parsl.egg-info → parsl-2025.10.13}/PKG-INFO +2 -2
  2. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/benchmark/perf.py +24 -8
  3. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/dataflow/dflow.py +5 -2
  4. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/base.py +2 -2
  5. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/globus_compute.py +0 -4
  6. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/high_throughput/executor.py +67 -14
  7. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/high_throughput/process_worker_pool.py +16 -3
  8. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/radios/filesystem.py +2 -1
  9. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/radios/htex.py +2 -1
  10. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/radios/multiprocessing.py +2 -1
  11. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/radios/udp.py +2 -1
  12. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/base.py +24 -37
  13. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_checkpointing/test_regression_233.py +0 -1
  14. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_htex.py +36 -1
  15. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_garbage_collect.py +1 -6
  16. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_memoize_2.py +11 -1
  17. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/version.py +1 -1
  18. {parsl-2025.9.29 → parsl-2025.10.13/parsl.egg-info}/PKG-INFO +2 -2
  19. {parsl-2025.9.29 → parsl-2025.10.13}/parsl.egg-info/SOURCES.txt +0 -1
  20. parsl-2025.9.29/parsl/tests/configs/local_threads_no_cache.py +0 -11
  21. {parsl-2025.9.29 → parsl-2025.10.13}/LICENSE +0 -0
  22. {parsl-2025.9.29 → parsl-2025.10.13}/MANIFEST.in +0 -0
  23. {parsl-2025.9.29 → parsl-2025.10.13}/README.rst +0 -0
  24. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/__init__.py +0 -0
  25. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/addresses.py +0 -0
  26. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/app/__init__.py +0 -0
  27. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/app/app.py +0 -0
  28. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/app/bash.py +0 -0
  29. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/app/errors.py +0 -0
  30. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/app/futures.py +0 -0
  31. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/app/python.py +0 -0
  32. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/benchmark/__init__.py +0 -0
  33. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/concurrent/__init__.py +0 -0
  34. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/config.py +0 -0
  35. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/ASPIRE1.py +0 -0
  36. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/Azure.py +0 -0
  37. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/__init__.py +0 -0
  38. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/anvil.py +0 -0
  39. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/bridges.py +0 -0
  40. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/cc_in2p3.py +0 -0
  41. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/delta.py +0 -0
  42. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/ec2.py +0 -0
  43. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/expanse.py +0 -0
  44. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/frontera.py +0 -0
  45. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/gc_multisite.py +0 -0
  46. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/gc_tutorial.py +0 -0
  47. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/htex_local.py +0 -0
  48. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/illinoiscluster.py +0 -0
  49. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/improv.py +0 -0
  50. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/kubernetes.py +0 -0
  51. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/local_threads.py +0 -0
  52. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/midway.py +0 -0
  53. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/osg.py +0 -0
  54. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/polaris.py +0 -0
  55. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/stampede2.py +0 -0
  56. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/summit.py +0 -0
  57. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/toss3_llnl.py +0 -0
  58. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/vineex_local.py +0 -0
  59. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/configs/wqex_local.py +0 -0
  60. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/curvezmq.py +0 -0
  61. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/data_provider/__init__.py +0 -0
  62. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/data_provider/data_manager.py +0 -0
  63. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/data_provider/file_noop.py +0 -0
  64. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/data_provider/files.py +0 -0
  65. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/data_provider/ftp.py +0 -0
  66. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/data_provider/globus.py +0 -0
  67. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/data_provider/http.py +0 -0
  68. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/data_provider/rsync.py +0 -0
  69. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/data_provider/staging.py +0 -0
  70. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/data_provider/zip.py +0 -0
  71. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/dataflow/__init__.py +0 -0
  72. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/dataflow/dependency_resolvers.py +0 -0
  73. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/dataflow/errors.py +0 -0
  74. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/dataflow/futures.py +0 -0
  75. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/dataflow/memoization.py +0 -0
  76. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/dataflow/rundirs.py +0 -0
  77. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/dataflow/states.py +0 -0
  78. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/dataflow/taskrecord.py +0 -0
  79. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/errors.py +0 -0
  80. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/__init__.py +0 -0
  81. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/errors.py +0 -0
  82. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/execute_task.py +0 -0
  83. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/flux/__init__.py +0 -0
  84. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/flux/execute_parsl_task.py +0 -0
  85. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/flux/executor.py +0 -0
  86. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/flux/flux_instance_manager.py +0 -0
  87. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/high_throughput/__init__.py +0 -0
  88. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/high_throughput/errors.py +0 -0
  89. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/high_throughput/interchange.py +0 -0
  90. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/high_throughput/manager_record.py +0 -0
  91. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/high_throughput/manager_selector.py +0 -0
  92. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/high_throughput/monitoring_info.py +0 -0
  93. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/high_throughput/mpi_executor.py +0 -0
  94. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/high_throughput/mpi_prefix_composer.py +0 -0
  95. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/high_throughput/mpi_resource_management.py +0 -0
  96. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/high_throughput/probe.py +0 -0
  97. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/high_throughput/zmq_pipes.py +0 -0
  98. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/radical/__init__.py +0 -0
  99. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/radical/executor.py +0 -0
  100. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/radical/rpex_resources.py +0 -0
  101. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/radical/rpex_worker.py +0 -0
  102. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/status_handling.py +0 -0
  103. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/taskvine/__init__.py +0 -0
  104. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/taskvine/errors.py +0 -0
  105. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/taskvine/exec_parsl_function.py +0 -0
  106. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/taskvine/executor.py +0 -0
  107. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/taskvine/factory.py +0 -0
  108. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/taskvine/factory_config.py +0 -0
  109. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/taskvine/manager.py +0 -0
  110. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/taskvine/manager_config.py +0 -0
  111. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/taskvine/utils.py +0 -0
  112. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/threads.py +0 -0
  113. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/workqueue/__init__.py +0 -0
  114. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/workqueue/errors.py +0 -0
  115. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/workqueue/exec_parsl_function.py +0 -0
  116. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/workqueue/executor.py +0 -0
  117. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/workqueue/parsl_coprocess.py +0 -0
  118. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
  119. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/jobs/__init__.py +0 -0
  120. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/jobs/error_handlers.py +0 -0
  121. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/jobs/errors.py +0 -0
  122. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/jobs/job_status_poller.py +0 -0
  123. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/jobs/states.py +0 -0
  124. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/jobs/strategy.py +0 -0
  125. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/launchers/__init__.py +0 -0
  126. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/launchers/base.py +0 -0
  127. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/launchers/errors.py +0 -0
  128. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/launchers/launchers.py +0 -0
  129. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/log_utils.py +0 -0
  130. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/__init__.py +0 -0
  131. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/db_manager.py +0 -0
  132. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/errors.py +0 -0
  133. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/message_type.py +0 -0
  134. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/monitoring.py +0 -0
  135. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/queries/__init__.py +0 -0
  136. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/queries/pandas.py +0 -0
  137. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/radios/__init__.py +0 -0
  138. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/radios/base.py +0 -0
  139. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/radios/filesystem_router.py +0 -0
  140. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/radios/udp_router.py +0 -0
  141. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/radios/zmq.py +0 -0
  142. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/radios/zmq_router.py +0 -0
  143. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/remote.py +0 -0
  144. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/types.py +0 -0
  145. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/__init__.py +0 -0
  146. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/app.py +0 -0
  147. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/models.py +0 -0
  148. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/plots/__init__.py +0 -0
  149. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
  150. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
  151. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/plots/default/workflow_plots.py +0 -0
  152. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +0 -0
  153. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
  154. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
  155. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/templates/app.html +0 -0
  156. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/templates/dag.html +0 -0
  157. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/templates/error.html +0 -0
  158. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/templates/layout.html +0 -0
  159. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
  160. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/templates/task.html +0 -0
  161. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/templates/workflow.html +0 -0
  162. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
  163. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/utils.py +0 -0
  164. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/version.py +0 -0
  165. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/monitoring/visualization/views.py +0 -0
  166. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/multiprocessing.py +0 -0
  167. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/process_loggers.py +0 -0
  168. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/__init__.py +0 -0
  169. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/aws/__init__.py +0 -0
  170. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/aws/aws.py +0 -0
  171. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/aws/template.py +0 -0
  172. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/azure/__init__.py +0 -0
  173. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/azure/azure.py +0 -0
  174. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/azure/template.py +0 -0
  175. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/cluster_provider.py +0 -0
  176. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/condor/__init__.py +0 -0
  177. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/condor/condor.py +0 -0
  178. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/condor/template.py +0 -0
  179. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/errors.py +0 -0
  180. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/googlecloud/__init__.py +0 -0
  181. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/googlecloud/googlecloud.py +0 -0
  182. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/grid_engine/__init__.py +0 -0
  183. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/grid_engine/grid_engine.py +0 -0
  184. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/grid_engine/template.py +0 -0
  185. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/kubernetes/__init__.py +0 -0
  186. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/kubernetes/kube.py +0 -0
  187. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/kubernetes/template.py +0 -0
  188. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/local/__init__.py +0 -0
  189. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/local/local.py +0 -0
  190. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/lsf/__init__.py +0 -0
  191. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/lsf/lsf.py +0 -0
  192. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/lsf/template.py +0 -0
  193. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/pbspro/__init__.py +0 -0
  194. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/pbspro/pbspro.py +0 -0
  195. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/pbspro/template.py +0 -0
  196. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/slurm/__init__.py +0 -0
  197. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/slurm/slurm.py +0 -0
  198. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/slurm/template.py +0 -0
  199. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/torque/__init__.py +0 -0
  200. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/torque/template.py +0 -0
  201. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/providers/torque/torque.py +0 -0
  202. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/py.typed +0 -0
  203. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/serialize/__init__.py +0 -0
  204. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/serialize/base.py +0 -0
  205. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/serialize/concretes.py +0 -0
  206. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/serialize/errors.py +0 -0
  207. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/serialize/facade.py +0 -0
  208. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/serialize/proxystore.py +0 -0
  209. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/__init__.py +0 -0
  210. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/callables_helper.py +0 -0
  211. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/__init__.py +0 -0
  212. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/azure_single_node.py +0 -0
  213. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/bluewaters.py +0 -0
  214. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/bridges.py +0 -0
  215. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/cc_in2p3.py +0 -0
  216. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/comet.py +0 -0
  217. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/ec2_single_node.py +0 -0
  218. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/ec2_spot.py +0 -0
  219. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/flux_local.py +0 -0
  220. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/frontera.py +0 -0
  221. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/globus_compute.py +0 -0
  222. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/htex_local.py +0 -0
  223. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/htex_local_alternate.py +0 -0
  224. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/htex_local_intask_staging.py +0 -0
  225. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/htex_local_rsync_staging.py +0 -0
  226. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/local_radical.py +0 -0
  227. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/local_radical_mpi.py +0 -0
  228. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/local_threads.py +0 -0
  229. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
  230. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
  231. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
  232. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
  233. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/local_threads_globus.py +0 -0
  234. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
  235. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/midway.py +0 -0
  236. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/nscc_singapore.py +0 -0
  237. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/osg_htex.py +0 -0
  238. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/petrelkube.py +0 -0
  239. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/slurm_local.py +0 -0
  240. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/summit.py +0 -0
  241. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/taskvine_ex.py +0 -0
  242. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/user_opts.py +0 -0
  243. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/configs/workqueue_ex.py +0 -0
  244. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/conftest.py +0 -0
  245. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/integration/__init__.py +0 -0
  246. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/integration/latency.py +0 -0
  247. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/integration/test_apps/__init__.py +0 -0
  248. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
  249. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/integration/test_stress/__init__.py +0 -0
  250. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
  251. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
  252. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/manual_tests/__init__.py +0 -0
  253. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/manual_tests/htex_local.py +0 -0
  254. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/manual_tests/test_basic.py +0 -0
  255. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/manual_tests/test_log_filter.py +0 -0
  256. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/manual_tests/test_memory_limits.py +0 -0
  257. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/manual_tests/test_regression_220.py +0 -0
  258. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/manual_tests/test_worker_count.py +0 -0
  259. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/site_tests/__init__.py +0 -0
  260. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/site_tests/site_config_selector.py +0 -0
  261. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/sites/__init__.py +0 -0
  262. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/sites/test_affinity.py +0 -0
  263. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/sites/test_concurrent.py +0 -0
  264. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/sites/test_dynamic_executor.py +0 -0
  265. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/sites/test_ec2.py +0 -0
  266. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/sites/test_launchers.py +0 -0
  267. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/sites/test_mpi/__init__.py +0 -0
  268. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/sites/test_worker_info.py +0 -0
  269. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_bash_apps/__init__.py +0 -0
  270. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
  271. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_bash_apps/test_basic.py +0 -0
  272. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
  273. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_bash_apps/test_inputs_default.py +0 -0
  274. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
  275. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -0
  276. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_bash_apps/test_memoize.py +0 -0
  277. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
  278. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
  279. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_bash_apps/test_multiline.py +0 -0
  280. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_bash_apps/test_pipeline.py +0 -0
  281. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_bash_apps/test_std_uri.py +0 -0
  282. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_bash_apps/test_stdout.py +0 -0
  283. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_callables.py +0 -0
  284. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_checkpointing/__init__.py +0 -0
  285. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_checkpointing/test_periodic.py +0 -0
  286. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +0 -0
  287. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
  288. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
  289. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
  290. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_checkpointing/test_task_exit.py +0 -0
  291. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_curvezmq.py +0 -0
  292. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_docs/__init__.py +0 -0
  293. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_docs/test_from_slides.py +0 -0
  294. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_docs/test_kwargs.py +0 -0
  295. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
  296. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_docs/test_workflow1.py +0 -0
  297. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_docs/test_workflow4.py +0 -0
  298. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_error_handling/__init__.py +0 -0
  299. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_error_handling/test_fail.py +0 -0
  300. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_error_handling/test_python_walltime.py +0 -0
  301. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_error_handling/test_resource_spec.py +0 -0
  302. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_error_handling/test_retries.py +0 -0
  303. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
  304. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
  305. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
  306. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
  307. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_execute_task.py +0 -0
  308. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_flowcontrol/__init__.py +0 -0
  309. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_flux.py +0 -0
  310. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/__init__.py +0 -0
  311. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_basic.py +0 -0
  312. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_block_manager_selector_unit.py +0 -0
  313. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_command_client_timeout.py +0 -0
  314. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_command_concurrency_regression_1321.py +0 -0
  315. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_connected_blocks.py +0 -0
  316. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_cpu_affinity_explicit.py +0 -0
  317. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_disconnected_blocks.py +0 -0
  318. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_disconnected_blocks_failing_provider.py +0 -0
  319. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_drain.py +0 -0
  320. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_interchange_exit_bad_registration.py +0 -0
  321. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_manager_failure.py +0 -0
  322. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_manager_selector_by_block.py +0 -0
  323. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_managers_command.py +0 -0
  324. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_missing_worker.py +0 -0
  325. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_multiple_disconnected_blocks.py +0 -0
  326. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_priority_queue.py +0 -0
  327. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_resource_spec_validation.py +0 -0
  328. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_worker_failure.py +0 -0
  329. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_htex/test_zmq_binding.py +0 -0
  330. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_monitoring/__init__.py +0 -0
  331. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_monitoring/test_app_names.py +0 -0
  332. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_monitoring/test_basic.py +0 -0
  333. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
  334. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_monitoring/test_exit_helper.py +0 -0
  335. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_monitoring/test_htex_fuzz_zmq.py +0 -0
  336. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +0 -0
  337. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_monitoring/test_incomplete_futures.py +0 -0
  338. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_monitoring/test_memoization_representation.py +0 -0
  339. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_monitoring/test_radio_filesystem.py +0 -0
  340. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_monitoring/test_radio_multiprocessing.py +0 -0
  341. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_monitoring/test_radio_udp.py +0 -0
  342. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_monitoring/test_radio_zmq.py +0 -0
  343. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_monitoring/test_stdouterr.py +0 -0
  344. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
  345. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_mpi_apps/__init__.py +0 -0
  346. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_mpi_apps/test_bad_mpi_config.py +0 -0
  347. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +0 -0
  348. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_mpi_apps/test_mpi_prefix.py +0 -0
  349. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_mpi_apps/test_mpi_scheduler.py +0 -0
  350. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_mpi_apps/test_mpiex.py +0 -0
  351. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_mpi_apps/test_resource_spec.py +0 -0
  352. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_providers/__init__.py +0 -0
  353. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_providers/test_kubernetes_provider.py +0 -0
  354. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_providers/test_local_provider.py +0 -0
  355. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_providers/test_pbspro_template.py +0 -0
  356. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_providers/test_slurm_instantiate.py +0 -0
  357. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_providers/test_slurm_template.py +0 -0
  358. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_providers/test_submiterror_deprecation.py +0 -0
  359. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/__init__.py +0 -0
  360. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
  361. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_basic.py +0 -0
  362. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_context_manager.py +0 -0
  363. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_dep_standard_futures.py +0 -0
  364. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
  365. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_dependencies_deep.py +0 -0
  366. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_depfail_propagation.py +0 -0
  367. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_fail.py +0 -0
  368. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
  369. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
  370. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_futures.py +0 -0
  371. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
  372. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_inputs_default.py +0 -0
  373. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_join.py +0 -0
  374. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_lifted.py +0 -0
  375. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_mapred.py +0 -0
  376. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
  377. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
  378. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +0 -0
  379. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_memoize_exception.py +0 -0
  380. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
  381. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
  382. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_outputs.py +0 -0
  383. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_overview.py +0 -0
  384. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_pipeline.py +0 -0
  385. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_pluggable_future_resolution.py +0 -0
  386. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_simple.py +0 -0
  387. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_timeout.py +0 -0
  388. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_python_apps/test_type5.py +0 -0
  389. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_radical/__init__.py +0 -0
  390. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_radical/test_mpi_funcs.py +0 -0
  391. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_regression/__init__.py +0 -0
  392. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_regression/test_1480.py +0 -0
  393. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +0 -0
  394. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_regression/test_1653.py +0 -0
  395. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_regression/test_221.py +0 -0
  396. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_regression/test_226.py +0 -0
  397. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_regression/test_2652.py +0 -0
  398. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_regression/test_3874.py +0 -0
  399. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_regression/test_69a.py +0 -0
  400. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_regression/test_97_parallelism_0.py +0 -0
  401. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_regression/test_98.py +0 -0
  402. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_scaling/__init__.py +0 -0
  403. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_scaling/test_block_error_handler.py +0 -0
  404. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_scaling/test_regression_1621.py +0 -0
  405. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_scaling/test_regression_3568_scaledown_vs_MISSING.py +0 -0
  406. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_scaling/test_regression_3696_oscillation.py +0 -0
  407. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_scaling/test_scale_down.py +0 -0
  408. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +0 -0
  409. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +0 -0
  410. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_scaling/test_shutdown_scalein.py +0 -0
  411. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_scaling/test_worker_interchange_bad_messages_3262.py +0 -0
  412. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_serialization/__init__.py +0 -0
  413. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_serialization/test_2555_caching_deserializer.py +0 -0
  414. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_serialization/test_3495_deserialize_managerlost.py +0 -0
  415. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_serialization/test_basic.py +0 -0
  416. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_serialization/test_htex_code_cache.py +0 -0
  417. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_serialization/test_proxystore_configured.py +0 -0
  418. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_serialization/test_proxystore_impl.py +0 -0
  419. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_shutdown/__init__.py +0 -0
  420. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_shutdown/test_kill_monitoring.py +0 -0
  421. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_staging/__init__.py +0 -0
  422. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_staging/staging_provider.py +0 -0
  423. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_staging/test_1316.py +0 -0
  424. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_staging/test_docs_1.py +0 -0
  425. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_staging/test_docs_2.py +0 -0
  426. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
  427. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_staging/test_file.py +0 -0
  428. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_staging/test_file_apps.py +0 -0
  429. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_staging/test_file_staging.py +0 -0
  430. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_staging/test_output_chain_filenames.py +0 -0
  431. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
  432. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
  433. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_staging/test_staging_globus.py +0 -0
  434. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_staging/test_staging_https.py +0 -0
  435. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_staging/test_staging_stdout.py +0 -0
  436. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_staging/test_zip_in.py +0 -0
  437. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_staging/test_zip_out.py +0 -0
  438. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_staging/test_zip_to_zip.py +0 -0
  439. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_summary.py +0 -0
  440. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_thread_parallelism.py +0 -0
  441. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_threads/__init__.py +0 -0
  442. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_threads/test_configs.py +0 -0
  443. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
  444. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_utils/__init__.py +0 -0
  445. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_utils/test_execute_wait.py +0 -0
  446. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_utils/test_logutils.py +0 -0
  447. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_utils/test_representation_mixin.py +0 -0
  448. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/test_utils/test_sanitize_dns.py +0 -0
  449. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/unit/__init__.py +0 -0
  450. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/unit/test_address.py +0 -0
  451. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/unit/test_file.py +0 -0
  452. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/unit/test_globus_compute_executor.py +0 -0
  453. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/unit/test_usage_tracking.py +0 -0
  454. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/tests/utils.py +0 -0
  455. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/usage_tracking/__init__.py +0 -0
  456. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/usage_tracking/api.py +0 -0
  457. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/usage_tracking/levels.py +0 -0
  458. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/usage_tracking/usage.py +0 -0
  459. {parsl-2025.9.29 → parsl-2025.10.13}/parsl/utils.py +0 -0
  460. {parsl-2025.9.29 → parsl-2025.10.13}/parsl.egg-info/dependency_links.txt +0 -0
  461. {parsl-2025.9.29 → parsl-2025.10.13}/parsl.egg-info/entry_points.txt +0 -0
  462. {parsl-2025.9.29 → parsl-2025.10.13}/parsl.egg-info/requires.txt +0 -0
  463. {parsl-2025.9.29 → parsl-2025.10.13}/parsl.egg-info/top_level.txt +0 -0
  464. {parsl-2025.9.29 → parsl-2025.10.13}/requirements.txt +0 -0
  465. {parsl-2025.9.29 → parsl-2025.10.13}/setup.cfg +0 -0
  466. {parsl-2025.9.29 → parsl-2025.10.13}/setup.py +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: parsl
3
- Version: 2025.9.29
3
+ Version: 2025.10.13
4
4
  Summary: Simple data dependent workflows in Python
5
5
  Home-page: https://github.com/Parsl/parsl
6
- Download-URL: https://github.com/Parsl/parsl/archive/2025.09.29.tar.gz
6
+ Download-URL: https://github.com/Parsl/parsl/archive/2025.10.13.tar.gz
7
7
  Author: The Parsl Team
8
8
  Author-email: parsl@googlegroups.com
9
9
  License: Apache 2.0
@@ -6,6 +6,7 @@ from typing import Any, Dict
6
6
 
7
7
  import parsl
8
8
  from parsl.dataflow.dflow import DataFlowKernel
9
+ from parsl.errors import InternalConsistencyError
9
10
 
10
11
  min_iterations = 2
11
12
 
@@ -40,19 +41,18 @@ def app(extra_payload: Any, parsl_resource_specification: Dict = {}) -> int:
40
41
  return 7
41
42
 
42
43
 
43
- def performance(*, resources: dict, target_t: float, args_extra_size: int) -> None:
44
+ def performance(*, resources: dict, target_t: float, args_extra_size: int, iterate_mode: str) -> None:
44
45
  n = 10
45
46
 
46
47
  delta_t: float
47
- delta_t = 0
48
-
49
- threshold_t = int(0.75 * target_t)
50
48
 
51
49
  iteration = 1
52
50
 
53
51
  args_extra_payload = "x" * args_extra_size
54
52
 
55
- while delta_t < threshold_t or iteration <= min_iterations:
53
+ iterate = True
54
+
55
+ while iterate:
56
56
  print(f"==== Iteration {iteration} ====")
57
57
  print(f"Will run {n} tasks to target {target_t} seconds runtime")
58
58
  start_t = time.time()
@@ -78,10 +78,20 @@ def performance(*, resources: dict, target_t: float, args_extra_size: int) -> No
78
78
  print(f"Runtime: actual {delta_t:.3f}s vs target {target_t}s")
79
79
  print(f"Tasks per second: {rate:.3f}")
80
80
 
81
- n = max(1, int(target_t * rate))
82
-
83
81
  iteration += 1
84
82
 
83
+ # decide upon next iteration
84
+
85
+ match iterate_mode:
86
+ case "estimate":
87
+ n = max(1, int(target_t * rate))
88
+ iterate = delta_t < (0.75 * target_t) or iteration <= min_iterations
89
+ case "exponential":
90
+ n = int(n * 2)
91
+ iterate = delta_t < target_t or iteration <= min_iterations
92
+ case _:
93
+ raise InternalConsistencyError(f"Bad iterate mode {iterate_mode} - should have been validated at arg parse time")
94
+
85
95
 
86
96
  def cli_run() -> None:
87
97
  parser = argparse.ArgumentParser(
@@ -96,6 +106,12 @@ Example usage: python -m parsl.benchmark.perf --config parsl/tests/configs/workq
96
106
  parser.add_argument("--time", metavar="SECONDS", help="target number of seconds for an iteration", default=120, type=float)
97
107
  parser.add_argument("--argsize", metavar="BYTES", help="extra bytes to add into app invocation arguments", default=0, type=int)
98
108
  parser.add_argument("--version", action="version", version=f"parsl-perf from Parsl {parsl.__version__}")
109
+ parser.add_argument("--iterate",
110
+ metavar="MODE",
111
+ help="Iteration mode: estimate, exponential",
112
+ type=str,
113
+ default="estimate",
114
+ choices=("estimate", "exponential"))
99
115
 
100
116
  args = parser.parse_args()
101
117
 
@@ -105,7 +121,7 @@ Example usage: python -m parsl.benchmark.perf --config parsl/tests/configs/workq
105
121
  resources = {}
106
122
 
107
123
  with load_dfk_from_config(args.config):
108
- performance(resources=resources, target_t=args.time, args_extra_size=args.argsize)
124
+ performance(resources=resources, target_t=args.time, args_extra_size=args.argsize, iterate_mode=args.iterate)
109
125
  print("Tests complete - leaving DFK block")
110
126
  print("The end")
111
127
 
@@ -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)
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
 
@@ -80,11 +80,11 @@ class ParslExecutor(metaclass=ABCMeta):
80
80
  self.shutdown()
81
81
  return False
82
82
 
83
- @abstractmethod
84
83
  def start(self) -> None:
85
84
  """Start the executor.
86
85
 
87
- Any spin-up operations (for example: starting thread pools) should be performed here.
86
+ By default, this does nothing, but this method should be overridden to
87
+ perform any spin-up operations (for example: starting thread pools).
88
88
  """
89
89
  pass
90
90
 
@@ -76,10 +76,6 @@ class GlobusComputeExecutor(ParslExecutor, RepresentationMixin):
76
76
  self.storage_access = storage_access
77
77
  self.working_dir = working_dir
78
78
 
79
- def start(self) -> None:
80
- """ Start the Globus Compute Executor """
81
- super().start()
82
-
83
79
  def submit(self, func: Callable, resource_specification: Dict[str, Any], *args: Any, **kwargs: Any) -> Future:
84
80
  """ Submit func to globus-compute
85
81
 
@@ -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
 
@@ -670,7 +676,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
670
676
  logger.debug("Sending hold to manager: {}".format(manager['manager']))
671
677
  self._hold_manager(manager['manager'])
672
678
 
673
- def submit(self, func, resource_specification, *args, **kwargs):
679
+ def submit(self, func: Callable, resource_specification: dict, *args, **kwargs) -> HTEXFuture:
674
680
  """Submits work to the outgoing_q.
675
681
 
676
682
  The outgoing_q is an external process listens on this
@@ -691,21 +697,11 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
691
697
 
692
698
  self.validate_resource_spec(resource_specification)
693
699
 
694
- if self.bad_state_is_set:
695
- raise self.executor_exception
696
-
697
- self._task_counter += 1
698
- task_id = self._task_counter
699
-
700
700
  # handle people sending blobs gracefully
701
701
  if logger.getEffectiveLevel() <= logging.DEBUG:
702
702
  args_to_print = tuple([ar if len(ar := repr(arg)) < 100 else (ar[:100] + '...') for arg in args])
703
703
  logger.debug("Pushing function {} to queue with args {}".format(func, args_to_print))
704
704
 
705
- fut = Future()
706
- fut.parsl_executor_task_id = task_id
707
- self.tasks[task_id] = fut
708
-
709
705
  try:
710
706
  fn_buf = pack_apply_message(func, args, kwargs, buffer_threshold=1 << 20)
711
707
  except TypeError:
@@ -715,12 +711,69 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
715
711
  if resource_specification:
716
712
  context["resource_spec"] = resource_specification
717
713
 
718
- msg = {"task_id": task_id, "context": context, "buffer": fn_buf}
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
719
773
 
720
- # Post task to the outgoing queue
774
+ msg = {"task_id": task_id, "context": context, "buffer": buffer}
721
775
  self.outgoing_q.put(msg)
722
776
 
723
- # Return the future
724
777
  return fut
725
778
 
726
779
  @property
@@ -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
@@ -378,7 +379,7 @@ class Manager:
378
379
  last_interchange_contact = time.time()
379
380
 
380
381
  if tasks == HEARTBEAT_CODE:
381
- logger.debug("Got heartbeat from interchange")
382
+ logger.debug("Got heartbeat response from interchange")
382
383
  elif tasks == DRAINED_CODE:
383
384
  logger.info("Got fully drained message from interchange - setting kill flag")
384
385
  self._stop_event.set()
@@ -778,8 +779,20 @@ def worker(
778
779
 
779
780
  _init_mpi_env(mpi_launcher=mpi_launcher, resource_spec=res_spec)
780
781
 
782
+ exec_func: Callable = execute_task
783
+ exec_args = ()
784
+ exec_kwargs = {}
785
+
781
786
  try:
782
- 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)
783
796
  serialized_result = serialize(result, buffer_threshold=1000000)
784
797
  except Exception as e:
785
798
  logger.info('Caught an exception: {}'.format(e))
@@ -10,11 +10,12 @@ from parsl.monitoring.radios.base import (
10
10
  RadioConfig,
11
11
  )
12
12
  from parsl.monitoring.radios.filesystem_router import FilesystemRadioReceiver
13
+ from parsl.utils import RepresentationMixin
13
14
 
14
15
  logger = logging.getLogger(__name__)
15
16
 
16
17
 
17
- class FilesystemRadio(RadioConfig):
18
+ class FilesystemRadio(RadioConfig, RepresentationMixin):
18
19
  """A MonitoringRadioSender that sends messages over a shared filesystem.
19
20
 
20
21
  The messsage directory structure is based on maildir,
@@ -7,11 +7,12 @@ from parsl.monitoring.radios.base import (
7
7
  MonitoringRadioSender,
8
8
  RadioConfig,
9
9
  )
10
+ from parsl.utils import RepresentationMixin
10
11
 
11
12
  logger = logging.getLogger(__name__)
12
13
 
13
14
 
14
- class HTEXRadio(RadioConfig):
15
+ class HTEXRadio(RadioConfig, RepresentationMixin):
15
16
  def create_sender(self) -> MonitoringRadioSender:
16
17
  return HTEXRadioSender()
17
18
 
@@ -5,9 +5,10 @@ from parsl.monitoring.radios.base import (
5
5
  MonitoringRadioSender,
6
6
  RadioConfig,
7
7
  )
8
+ from parsl.utils import RepresentationMixin
8
9
 
9
10
 
10
- class MultiprocessingQueueRadioSender(MonitoringRadioSender):
11
+ class MultiprocessingQueueRadioSender(MonitoringRadioSender, RepresentationMixin):
11
12
  """A monitoring radio which connects over a multiprocessing Queue.
12
13
  This radio is intended to be used on the submit side, where components
13
14
  in the submit process, or processes launched by multiprocessing, will have
@@ -13,11 +13,12 @@ from parsl.monitoring.radios.base import (
13
13
  RadioConfig,
14
14
  )
15
15
  from parsl.monitoring.radios.udp_router import start_udp_receiver
16
+ from parsl.utils import RepresentationMixin
16
17
 
17
18
  logger = logging.getLogger(__name__)
18
19
 
19
20
 
20
- class UDPRadio(RadioConfig):
21
+ class UDPRadio(RadioConfig, RepresentationMixin):
21
22
  def __init__(self, *, port: Optional[int] = None, atexit_timeout: int = 3, address: str, debug: bool = False, hmac_digest: str = 'sha512'):
22
23
  self.port = port
23
24
  self.atexit_timeout = atexit_timeout
@@ -33,7 +33,28 @@ class ExecutionProvider(metaclass=ABCMeta):
33
33
  [cancel] <--------|----+
34
34
  |
35
35
  +-------------------
36
- """
36
+
37
+ In addition to the listed methods, an ExecutionProvider instance must always
38
+ have these attributes, which both default to `None`:
39
+
40
+ mem_per_node: Real memory to provision per node in GB.
41
+
42
+ Providers which set this attribute should ask for mem_per_node of memory
43
+ when provisioning resources, and set the corresponding environment
44
+ variable PARSL_MEMORY_GB before executing submitted commands.
45
+
46
+ If this attribute is set, executors may use it to calculate how many tasks can
47
+ run concurrently per node.
48
+
49
+ cores_per_node: Number of cores to provision per node.
50
+
51
+ Providers which set this attribute should ask for cores_per_node cores
52
+ when provisioning resources, and set the corresponding environment
53
+ variable PARSL_CORES before executing submitted commands.
54
+
55
+ If this attribute is set, executors may use it to calculate how many tasks can
56
+ run concurrently per node.
57
+ """
37
58
 
38
59
  @abstractmethod
39
60
  def __init__(self) -> None:
@@ -44,8 +65,8 @@ class ExecutionProvider(metaclass=ABCMeta):
44
65
  self.script_dir: Optional[str]
45
66
  self.parallelism: float
46
67
  self.resources: Dict[object, Any]
47
- self._cores_per_node: Optional[int] = None
48
- self._mem_per_node: Optional[float] = None
68
+ self.cores_per_node: Optional[int] = None
69
+ self.mem_per_node: Optional[float] = None
49
70
  pass
50
71
 
51
72
  @abstractmethod
@@ -111,40 +132,6 @@ class ExecutionProvider(metaclass=ABCMeta):
111
132
  ''' Provides the label for this provider '''
112
133
  pass
113
134
 
114
- @property
115
- def mem_per_node(self) -> Optional[float]:
116
- """Real memory to provision per node in GB.
117
-
118
- Providers which set this property should ask for mem_per_node of memory
119
- when provisioning resources, and set the corresponding environment
120
- variable PARSL_MEMORY_GB before executing submitted commands.
121
-
122
- If this property is set, executors may use it to calculate how many tasks can
123
- run concurrently per node.
124
- """
125
- return self._mem_per_node
126
-
127
- @mem_per_node.setter
128
- def mem_per_node(self, value: float) -> None:
129
- self._mem_per_node = value
130
-
131
- @property
132
- def cores_per_node(self) -> Optional[int]:
133
- """Number of cores to provision per node.
134
-
135
- Providers which set this property should ask for cores_per_node cores
136
- when provisioning resources, and set the corresponding environment
137
- variable PARSL_CORES before executing submitted commands.
138
-
139
- If this property is set, executors may use it to calculate how many tasks can
140
- run concurrently per node.
141
- """
142
- return self._cores_per_node
143
-
144
- @cores_per_node.setter
145
- def cores_per_node(self, value: int) -> None:
146
- self._cores_per_node = value
147
-
148
135
  @property
149
136
  @abstractmethod
150
137
  def status_polling_interval(self) -> int:
@@ -5,7 +5,6 @@ from parsl.dataflow.dflow import DataFlowKernel
5
5
 
6
6
 
7
7
  def run_checkpointed(checkpoints):
8
- # set_stream_logger()
9
8
  from parsl.tests.configs.local_threads_checkpoint_task_exit import config
10
9
  config.checkpoint_files = checkpoints
11
10
  dfk = DataFlowKernel(config=config)
@@ -7,6 +7,7 @@ from unittest import mock
7
7
  import pytest
8
8
 
9
9
  from parsl import HighThroughputExecutor, curvezmq
10
+ from parsl.serialize.facade import pack_apply_message, unpack_apply_message
10
11
 
11
12
  _MOCK_BASE = "parsl.executors.high_throughput.executor"
12
13
 
@@ -19,11 +20,16 @@ def encrypted(request: pytest.FixtureRequest):
19
20
 
20
21
 
21
22
  @pytest.fixture
22
- def htex(encrypted: bool):
23
+ def htex(encrypted: bool, tmpd_cwd):
23
24
  htex = HighThroughputExecutor(encrypted=encrypted)
25
+ htex.max_workers_per_node = 1
26
+ htex.run_dir = tmpd_cwd
27
+ htex.provider.script_dir = tmpd_cwd
24
28
 
25
29
  yield htex
26
30
 
31
+ if hasattr(htex, "outgoing_q"):
32
+ htex.scale_in(blocks=1000)
27
33
  htex.shutdown()
28
34
 
29
35
 
@@ -146,3 +152,32 @@ def test_htex_interchange_launch_cmd(cmd: Optional[Sequence[str]]):
146
152
  else:
147
153
  htex = HighThroughputExecutor()
148
154
  assert htex.interchange_launch_cmd == ["interchange.py"]
155
+
156
+
157
+ def dyn_exec(buf, *vec_y):
158
+ f, a, _ = unpack_apply_message(buf)
159
+ custom_args = [a, vec_y]
160
+ return f(*custom_args)
161
+
162
+
163
+ @pytest.mark.local
164
+ def test_worker_dynamic_import(htex: HighThroughputExecutor):
165
+ def _dot_prod(vec_x, vec_y):
166
+ return sum(x * y for x, y in zip(vec_x, vec_y))
167
+
168
+ htex.start()
169
+ htex.scale_out_facade(1)
170
+
171
+ num_array = tuple(range(10))
172
+
173
+ fn_buf = pack_apply_message(_dot_prod, num_array, {})
174
+ ctxt = {
175
+ "task_executor": {
176
+ "f": f"{dyn_exec.__module__}.{dyn_exec.__name__}",
177
+ "a": num_array, # prove "custom" dyn_exec
178
+ }
179
+ }
180
+ val = htex.submit_payload(ctxt, fn_buf).result()
181
+ exp_val = _dot_prod(num_array, num_array)
182
+
183
+ assert val == exp_val
@@ -27,10 +27,5 @@ def test_garbage_collect():
27
27
 
28
28
  evt.set()
29
29
  assert x.result() == 10 * 4
30
- if parsl.dfk().checkpoint_mode is not None:
31
- # We explicit call checkpoint if checkpoint_mode is enabled covering
32
- # cases like manual/periodic where checkpointing may be deferred.
33
- parsl.dfk().checkpoint()
34
-
35
- time.sleep(0.01) # Give enough time for task wipes to work
30
+ time.sleep(0.01) # Give enough time for task wipes to work - see issue #1279
36
31
  assert x.tid not in parsl.dfk().tasks, "Task record should be wiped after task completion"
@@ -4,7 +4,17 @@ import pytest
4
4
 
5
5
  import parsl
6
6
  from parsl.app.app import python_app
7
- from parsl.tests.configs.local_threads_no_cache import fresh_config as local_config
7
+ from parsl.config import Config
8
+ from parsl.executors.threads import ThreadPoolExecutor
9
+
10
+
11
+ def local_config():
12
+ return Config(
13
+ executors=[
14
+ ThreadPoolExecutor(max_threads=4),
15
+ ],
16
+ app_cache=False
17
+ )
8
18
 
9
19
 
10
20
  @python_app
@@ -3,4 +3,4 @@
3
3
  Year.Month.Day[alpha/beta/..]
4
4
  Alphas will be numbered like this -> 2024.12.10a0
5
5
  """
6
- VERSION = '2025.09.29'
6
+ VERSION = '2025.10.13'
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: parsl
3
- Version: 2025.9.29
3
+ Version: 2025.10.13
4
4
  Summary: Simple data dependent workflows in Python
5
5
  Home-page: https://github.com/Parsl/parsl
6
- Download-URL: https://github.com/Parsl/parsl/archive/2025.09.29.tar.gz
6
+ Download-URL: https://github.com/Parsl/parsl/archive/2025.10.13.tar.gz
7
7
  Author: The Parsl Team
8
8
  Author-email: parsl@googlegroups.com
9
9
  License: Apache 2.0
@@ -241,7 +241,6 @@ parsl/tests/configs/local_threads_checkpoint_task_exit.py
241
241
  parsl/tests/configs/local_threads_ftp_in_task.py
242
242
  parsl/tests/configs/local_threads_globus.py
243
243
  parsl/tests/configs/local_threads_http_in_task.py
244
- parsl/tests/configs/local_threads_no_cache.py
245
244
  parsl/tests/configs/midway.py
246
245
  parsl/tests/configs/nscc_singapore.py
247
246
  parsl/tests/configs/osg_htex.py
@@ -1,11 +0,0 @@
1
- from parsl.config import Config
2
- from parsl.executors.threads import ThreadPoolExecutor
3
-
4
-
5
- def fresh_config():
6
- return Config(
7
- executors=[
8
- ThreadPoolExecutor(max_threads=4),
9
- ],
10
- app_cache=False
11
- )
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes