parsl 2025.9.8__tar.gz → 2025.9.15__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 (473) hide show
  1. {parsl-2025.9.8/parsl.egg-info → parsl-2025.9.15}/PKG-INFO +2 -2
  2. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/curvezmq.py +0 -16
  3. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/high_throughput/executor.py +8 -0
  4. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/high_throughput/interchange.py +10 -1
  5. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/high_throughput/zmq_pipes.py +29 -43
  6. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/monitoring.py +2 -2
  7. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/multiprocessing.py +0 -49
  8. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_curvezmq.py +0 -42
  9. parsl-2025.9.15/parsl/tests/test_htex/test_command_concurrency_regression_1321.py +54 -0
  10. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_interchange_exit_bad_registration.py +2 -1
  11. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_priority_queue.py +1 -0
  12. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_zmq_binding.py +2 -1
  13. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/version.py +1 -1
  14. {parsl-2025.9.8 → parsl-2025.9.15/parsl.egg-info}/PKG-INFO +2 -2
  15. {parsl-2025.9.8 → parsl-2025.9.15}/parsl.egg-info/SOURCES.txt +1 -6
  16. parsl-2025.9.8/parsl/tests/site_tests/test_provider.py +0 -88
  17. parsl-2025.9.8/parsl/tests/site_tests/test_site.py +0 -70
  18. parsl-2025.9.8/parsl/tests/test_aalst_patterns.py +0 -474
  19. parsl-2025.9.8/parsl/tests/test_docs/test_workflow2.py +0 -42
  20. parsl-2025.9.8/parsl/tests/test_error_handling/test_rand_fail.py +0 -171
  21. parsl-2025.9.8/parsl/tests/test_regression/test_854.py +0 -62
  22. {parsl-2025.9.8 → parsl-2025.9.15}/LICENSE +0 -0
  23. {parsl-2025.9.8 → parsl-2025.9.15}/MANIFEST.in +0 -0
  24. {parsl-2025.9.8 → parsl-2025.9.15}/README.rst +0 -0
  25. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/__init__.py +0 -0
  26. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/addresses.py +0 -0
  27. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/app/__init__.py +0 -0
  28. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/app/app.py +0 -0
  29. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/app/bash.py +0 -0
  30. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/app/errors.py +0 -0
  31. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/app/futures.py +0 -0
  32. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/app/python.py +0 -0
  33. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/benchmark/__init__.py +0 -0
  34. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/benchmark/perf.py +0 -0
  35. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/concurrent/__init__.py +0 -0
  36. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/config.py +0 -0
  37. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/ASPIRE1.py +0 -0
  38. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/Azure.py +0 -0
  39. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/__init__.py +0 -0
  40. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/anvil.py +0 -0
  41. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/bridges.py +0 -0
  42. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/cc_in2p3.py +0 -0
  43. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/delta.py +0 -0
  44. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/ec2.py +0 -0
  45. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/expanse.py +0 -0
  46. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/frontera.py +0 -0
  47. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/gc_multisite.py +0 -0
  48. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/gc_tutorial.py +0 -0
  49. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/htex_local.py +0 -0
  50. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/illinoiscluster.py +0 -0
  51. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/improv.py +0 -0
  52. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/kubernetes.py +0 -0
  53. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/local_threads.py +0 -0
  54. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/midway.py +0 -0
  55. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/osg.py +0 -0
  56. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/polaris.py +0 -0
  57. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/stampede2.py +0 -0
  58. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/summit.py +0 -0
  59. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/toss3_llnl.py +0 -0
  60. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/vineex_local.py +0 -0
  61. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/configs/wqex_local.py +0 -0
  62. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/data_provider/__init__.py +0 -0
  63. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/data_provider/data_manager.py +0 -0
  64. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/data_provider/file_noop.py +0 -0
  65. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/data_provider/files.py +0 -0
  66. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/data_provider/ftp.py +0 -0
  67. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/data_provider/globus.py +0 -0
  68. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/data_provider/http.py +0 -0
  69. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/data_provider/rsync.py +0 -0
  70. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/data_provider/staging.py +0 -0
  71. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/data_provider/zip.py +0 -0
  72. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/dataflow/__init__.py +0 -0
  73. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/dataflow/dependency_resolvers.py +0 -0
  74. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/dataflow/dflow.py +0 -0
  75. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/dataflow/errors.py +0 -0
  76. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/dataflow/futures.py +0 -0
  77. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/dataflow/memoization.py +0 -0
  78. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/dataflow/rundirs.py +0 -0
  79. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/dataflow/states.py +0 -0
  80. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/dataflow/taskrecord.py +0 -0
  81. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/errors.py +0 -0
  82. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/__init__.py +0 -0
  83. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/base.py +0 -0
  84. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/errors.py +0 -0
  85. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/execute_task.py +0 -0
  86. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/flux/__init__.py +0 -0
  87. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/flux/execute_parsl_task.py +0 -0
  88. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/flux/executor.py +0 -0
  89. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/flux/flux_instance_manager.py +0 -0
  90. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/globus_compute.py +0 -0
  91. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/high_throughput/__init__.py +0 -0
  92. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/high_throughput/errors.py +0 -0
  93. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/high_throughput/manager_record.py +0 -0
  94. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/high_throughput/manager_selector.py +0 -0
  95. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/high_throughput/monitoring_info.py +0 -0
  96. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/high_throughput/mpi_executor.py +0 -0
  97. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/high_throughput/mpi_prefix_composer.py +0 -0
  98. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/high_throughput/mpi_resource_management.py +0 -0
  99. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/high_throughput/probe.py +0 -0
  100. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/high_throughput/process_worker_pool.py +0 -0
  101. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/radical/__init__.py +0 -0
  102. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/radical/executor.py +0 -0
  103. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/radical/rpex_resources.py +0 -0
  104. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/radical/rpex_worker.py +0 -0
  105. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/status_handling.py +0 -0
  106. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/taskvine/__init__.py +0 -0
  107. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/taskvine/errors.py +0 -0
  108. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/taskvine/exec_parsl_function.py +0 -0
  109. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/taskvine/executor.py +0 -0
  110. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/taskvine/factory.py +0 -0
  111. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/taskvine/factory_config.py +0 -0
  112. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/taskvine/manager.py +0 -0
  113. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/taskvine/manager_config.py +0 -0
  114. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/taskvine/utils.py +0 -0
  115. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/threads.py +0 -0
  116. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/workqueue/__init__.py +0 -0
  117. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/workqueue/errors.py +0 -0
  118. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/workqueue/exec_parsl_function.py +0 -0
  119. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/workqueue/executor.py +0 -0
  120. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/workqueue/parsl_coprocess.py +0 -0
  121. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
  122. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/jobs/__init__.py +0 -0
  123. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/jobs/error_handlers.py +0 -0
  124. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/jobs/errors.py +0 -0
  125. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/jobs/job_status_poller.py +0 -0
  126. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/jobs/states.py +0 -0
  127. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/jobs/strategy.py +0 -0
  128. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/launchers/__init__.py +0 -0
  129. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/launchers/base.py +0 -0
  130. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/launchers/errors.py +0 -0
  131. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/launchers/launchers.py +0 -0
  132. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/log_utils.py +0 -0
  133. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/__init__.py +0 -0
  134. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/db_manager.py +0 -0
  135. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/errors.py +0 -0
  136. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/message_type.py +0 -0
  137. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/queries/__init__.py +0 -0
  138. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/queries/pandas.py +0 -0
  139. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/radios/__init__.py +0 -0
  140. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/radios/base.py +0 -0
  141. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/radios/filesystem.py +0 -0
  142. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/radios/filesystem_router.py +0 -0
  143. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/radios/htex.py +0 -0
  144. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/radios/multiprocessing.py +0 -0
  145. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/radios/udp.py +0 -0
  146. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/radios/udp_router.py +0 -0
  147. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/radios/zmq.py +0 -0
  148. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/radios/zmq_router.py +0 -0
  149. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/remote.py +0 -0
  150. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/types.py +0 -0
  151. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/__init__.py +0 -0
  152. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/app.py +0 -0
  153. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/models.py +0 -0
  154. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/plots/__init__.py +0 -0
  155. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
  156. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
  157. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/plots/default/workflow_plots.py +0 -0
  158. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +0 -0
  159. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
  160. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
  161. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/templates/app.html +0 -0
  162. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/templates/dag.html +0 -0
  163. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/templates/error.html +0 -0
  164. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/templates/layout.html +0 -0
  165. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
  166. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/templates/task.html +0 -0
  167. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/templates/workflow.html +0 -0
  168. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
  169. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/utils.py +0 -0
  170. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/version.py +0 -0
  171. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/monitoring/visualization/views.py +0 -0
  172. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/process_loggers.py +0 -0
  173. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/__init__.py +0 -0
  174. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/aws/__init__.py +0 -0
  175. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/aws/aws.py +0 -0
  176. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/aws/template.py +0 -0
  177. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/azure/__init__.py +0 -0
  178. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/azure/azure.py +0 -0
  179. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/azure/template.py +0 -0
  180. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/base.py +0 -0
  181. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/cluster_provider.py +0 -0
  182. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/condor/__init__.py +0 -0
  183. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/condor/condor.py +0 -0
  184. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/condor/template.py +0 -0
  185. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/errors.py +0 -0
  186. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/googlecloud/__init__.py +0 -0
  187. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/googlecloud/googlecloud.py +0 -0
  188. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/grid_engine/__init__.py +0 -0
  189. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/grid_engine/grid_engine.py +0 -0
  190. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/grid_engine/template.py +0 -0
  191. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/kubernetes/__init__.py +0 -0
  192. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/kubernetes/kube.py +0 -0
  193. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/kubernetes/template.py +0 -0
  194. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/local/__init__.py +0 -0
  195. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/local/local.py +0 -0
  196. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/lsf/__init__.py +0 -0
  197. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/lsf/lsf.py +0 -0
  198. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/lsf/template.py +0 -0
  199. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/pbspro/__init__.py +0 -0
  200. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/pbspro/pbspro.py +0 -0
  201. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/pbspro/template.py +0 -0
  202. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/slurm/__init__.py +0 -0
  203. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/slurm/slurm.py +0 -0
  204. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/slurm/template.py +0 -0
  205. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/torque/__init__.py +0 -0
  206. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/torque/template.py +0 -0
  207. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/providers/torque/torque.py +0 -0
  208. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/py.typed +0 -0
  209. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/serialize/__init__.py +0 -0
  210. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/serialize/base.py +0 -0
  211. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/serialize/concretes.py +0 -0
  212. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/serialize/errors.py +0 -0
  213. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/serialize/facade.py +0 -0
  214. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/serialize/proxystore.py +0 -0
  215. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/__init__.py +0 -0
  216. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/callables_helper.py +0 -0
  217. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/__init__.py +0 -0
  218. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/azure_single_node.py +0 -0
  219. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/bluewaters.py +0 -0
  220. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/bridges.py +0 -0
  221. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/cc_in2p3.py +0 -0
  222. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/comet.py +0 -0
  223. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/ec2_single_node.py +0 -0
  224. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/ec2_spot.py +0 -0
  225. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/flux_local.py +0 -0
  226. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/frontera.py +0 -0
  227. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/globus_compute.py +0 -0
  228. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/htex_local.py +0 -0
  229. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/htex_local_alternate.py +0 -0
  230. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/htex_local_intask_staging.py +0 -0
  231. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/htex_local_rsync_staging.py +0 -0
  232. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/local_radical.py +0 -0
  233. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/local_radical_mpi.py +0 -0
  234. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/local_threads.py +0 -0
  235. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
  236. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
  237. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/local_threads_checkpoint_periodic.py +0 -0
  238. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
  239. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
  240. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/local_threads_globus.py +0 -0
  241. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
  242. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/local_threads_no_cache.py +0 -0
  243. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/midway.py +0 -0
  244. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/nscc_singapore.py +0 -0
  245. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/osg_htex.py +0 -0
  246. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/petrelkube.py +0 -0
  247. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/slurm_local.py +0 -0
  248. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/summit.py +0 -0
  249. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/taskvine_ex.py +0 -0
  250. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/user_opts.py +0 -0
  251. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/configs/workqueue_ex.py +0 -0
  252. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/conftest.py +0 -0
  253. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/integration/__init__.py +0 -0
  254. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/integration/latency.py +0 -0
  255. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/integration/test_apps/__init__.py +0 -0
  256. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
  257. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/integration/test_stress/__init__.py +0 -0
  258. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
  259. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
  260. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/manual_tests/__init__.py +0 -0
  261. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/manual_tests/htex_local.py +0 -0
  262. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/manual_tests/test_basic.py +0 -0
  263. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/manual_tests/test_log_filter.py +0 -0
  264. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/manual_tests/test_memory_limits.py +0 -0
  265. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/manual_tests/test_regression_220.py +0 -0
  266. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/manual_tests/test_worker_count.py +0 -0
  267. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/site_tests/__init__.py +0 -0
  268. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/site_tests/site_config_selector.py +0 -0
  269. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/sites/__init__.py +0 -0
  270. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/sites/test_affinity.py +0 -0
  271. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/sites/test_concurrent.py +0 -0
  272. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/sites/test_dynamic_executor.py +0 -0
  273. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/sites/test_ec2.py +0 -0
  274. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/sites/test_launchers.py +0 -0
  275. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/sites/test_mpi/__init__.py +0 -0
  276. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/sites/test_worker_info.py +0 -0
  277. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_bash_apps/__init__.py +0 -0
  278. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
  279. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_basic.py +0 -0
  280. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
  281. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_inputs_default.py +0 -0
  282. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
  283. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -0
  284. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_memoize.py +0 -0
  285. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
  286. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
  287. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_multiline.py +0 -0
  288. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_pipeline.py +0 -0
  289. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_std_uri.py +0 -0
  290. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_stdout.py +0 -0
  291. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_callables.py +0 -0
  292. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_checkpointing/__init__.py +0 -0
  293. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_checkpointing/test_periodic.py +0 -0
  294. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +0 -0
  295. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
  296. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
  297. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_checkpointing/test_regression_233.py +0 -0
  298. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
  299. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_checkpointing/test_task_exit.py +0 -0
  300. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_docs/__init__.py +0 -0
  301. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_docs/test_from_slides.py +0 -0
  302. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_docs/test_kwargs.py +0 -0
  303. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
  304. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_docs/test_workflow1.py +0 -0
  305. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_docs/test_workflow4.py +0 -0
  306. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_error_handling/__init__.py +0 -0
  307. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_error_handling/test_fail.py +0 -0
  308. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_error_handling/test_python_walltime.py +0 -0
  309. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_error_handling/test_resource_spec.py +0 -0
  310. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_error_handling/test_retries.py +0 -0
  311. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
  312. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
  313. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
  314. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
  315. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_execute_task.py +0 -0
  316. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_flowcontrol/__init__.py +0 -0
  317. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_flux.py +0 -0
  318. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/__init__.py +0 -0
  319. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_basic.py +0 -0
  320. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_block_manager_selector_unit.py +0 -0
  321. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_command_client_timeout.py +0 -0
  322. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_connected_blocks.py +0 -0
  323. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_cpu_affinity_explicit.py +0 -0
  324. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_disconnected_blocks.py +0 -0
  325. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_disconnected_blocks_failing_provider.py +0 -0
  326. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_drain.py +0 -0
  327. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_htex.py +0 -0
  328. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_manager_failure.py +0 -0
  329. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_manager_selector_by_block.py +0 -0
  330. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_managers_command.py +0 -0
  331. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_missing_worker.py +0 -0
  332. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_multiple_disconnected_blocks.py +0 -0
  333. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_resource_spec_validation.py +0 -0
  334. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_htex/test_worker_failure.py +0 -0
  335. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_monitoring/__init__.py +0 -0
  336. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_app_names.py +0 -0
  337. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_basic.py +0 -0
  338. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
  339. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_exit_helper.py +0 -0
  340. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_htex_fuzz_zmq.py +0 -0
  341. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +0 -0
  342. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_incomplete_futures.py +0 -0
  343. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_memoization_representation.py +0 -0
  344. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_radio_filesystem.py +0 -0
  345. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_radio_multiprocessing.py +0 -0
  346. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_radio_udp.py +0 -0
  347. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_radio_zmq.py +0 -0
  348. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_stdouterr.py +0 -0
  349. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
  350. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_mpi_apps/__init__.py +0 -0
  351. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_mpi_apps/test_bad_mpi_config.py +0 -0
  352. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +0 -0
  353. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_mpi_apps/test_mpi_prefix.py +0 -0
  354. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_mpi_apps/test_mpi_scheduler.py +0 -0
  355. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_mpi_apps/test_mpiex.py +0 -0
  356. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_mpi_apps/test_resource_spec.py +0 -0
  357. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_providers/__init__.py +0 -0
  358. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_providers/test_kubernetes_provider.py +0 -0
  359. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_providers/test_local_provider.py +0 -0
  360. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_providers/test_pbspro_template.py +0 -0
  361. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_providers/test_slurm_instantiate.py +0 -0
  362. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_providers/test_slurm_template.py +0 -0
  363. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_providers/test_submiterror_deprecation.py +0 -0
  364. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/__init__.py +0 -0
  365. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
  366. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_basic.py +0 -0
  367. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_context_manager.py +0 -0
  368. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_dep_standard_futures.py +0 -0
  369. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
  370. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_dependencies_deep.py +0 -0
  371. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_depfail_propagation.py +0 -0
  372. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_fail.py +0 -0
  373. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
  374. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
  375. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_futures.py +0 -0
  376. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_garbage_collect.py +0 -0
  377. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
  378. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_inputs_default.py +0 -0
  379. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_join.py +0 -0
  380. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_lifted.py +0 -0
  381. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_mapred.py +0 -0
  382. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
  383. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_memoize_2.py +0 -0
  384. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
  385. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +0 -0
  386. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_memoize_exception.py +0 -0
  387. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
  388. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
  389. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_outputs.py +0 -0
  390. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_overview.py +0 -0
  391. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_pipeline.py +0 -0
  392. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_pluggable_future_resolution.py +0 -0
  393. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_simple.py +0 -0
  394. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_timeout.py +0 -0
  395. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_type5.py +0 -0
  396. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_radical/__init__.py +0 -0
  397. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_radical/test_mpi_funcs.py +0 -0
  398. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_regression/__init__.py +0 -0
  399. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_regression/test_1480.py +0 -0
  400. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +0 -0
  401. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_regression/test_1653.py +0 -0
  402. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_regression/test_221.py +0 -0
  403. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_regression/test_226.py +0 -0
  404. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_regression/test_2652.py +0 -0
  405. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_regression/test_69a.py +0 -0
  406. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_regression/test_97_parallelism_0.py +0 -0
  407. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_regression/test_98.py +0 -0
  408. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_scaling/__init__.py +0 -0
  409. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_scaling/test_block_error_handler.py +0 -0
  410. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_scaling/test_regression_1621.py +0 -0
  411. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_scaling/test_regression_3568_scaledown_vs_MISSING.py +0 -0
  412. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_scaling/test_regression_3696_oscillation.py +0 -0
  413. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_scaling/test_scale_down.py +0 -0
  414. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +0 -0
  415. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +0 -0
  416. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_scaling/test_shutdown_scalein.py +0 -0
  417. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_scaling/test_worker_interchange_bad_messages_3262.py +0 -0
  418. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_serialization/__init__.py +0 -0
  419. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_serialization/test_2555_caching_deserializer.py +0 -0
  420. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_serialization/test_3495_deserialize_managerlost.py +0 -0
  421. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_serialization/test_basic.py +0 -0
  422. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_serialization/test_htex_code_cache.py +0 -0
  423. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_serialization/test_pack_resource_spec.py +0 -0
  424. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_serialization/test_proxystore_configured.py +0 -0
  425. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_serialization/test_proxystore_impl.py +0 -0
  426. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_shutdown/__init__.py +0 -0
  427. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_shutdown/test_kill_monitoring.py +0 -0
  428. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_staging/__init__.py +0 -0
  429. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_staging/staging_provider.py +0 -0
  430. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_staging/test_1316.py +0 -0
  431. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_staging/test_docs_1.py +0 -0
  432. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_staging/test_docs_2.py +0 -0
  433. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
  434. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_staging/test_file.py +0 -0
  435. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_staging/test_file_apps.py +0 -0
  436. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_staging/test_file_staging.py +0 -0
  437. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_staging/test_output_chain_filenames.py +0 -0
  438. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
  439. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
  440. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_staging/test_staging_globus.py +0 -0
  441. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_staging/test_staging_https.py +0 -0
  442. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_staging/test_staging_stdout.py +0 -0
  443. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_staging/test_zip_in.py +0 -0
  444. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_staging/test_zip_out.py +0 -0
  445. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_staging/test_zip_to_zip.py +0 -0
  446. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_summary.py +0 -0
  447. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_thread_parallelism.py +0 -0
  448. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_threads/__init__.py +0 -0
  449. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_threads/test_configs.py +0 -0
  450. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
  451. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_utils/__init__.py +0 -0
  452. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_utils/test_execute_wait.py +0 -0
  453. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_utils/test_logutils.py +0 -0
  454. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_utils/test_representation_mixin.py +0 -0
  455. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/test_utils/test_sanitize_dns.py +0 -0
  456. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/unit/__init__.py +0 -0
  457. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/unit/test_address.py +0 -0
  458. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/unit/test_file.py +0 -0
  459. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/unit/test_globus_compute_executor.py +0 -0
  460. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/unit/test_usage_tracking.py +0 -0
  461. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/tests/utils.py +0 -0
  462. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/usage_tracking/__init__.py +0 -0
  463. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/usage_tracking/api.py +0 -0
  464. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/usage_tracking/levels.py +0 -0
  465. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/usage_tracking/usage.py +0 -0
  466. {parsl-2025.9.8 → parsl-2025.9.15}/parsl/utils.py +0 -0
  467. {parsl-2025.9.8 → parsl-2025.9.15}/parsl.egg-info/dependency_links.txt +0 -0
  468. {parsl-2025.9.8 → parsl-2025.9.15}/parsl.egg-info/entry_points.txt +0 -0
  469. {parsl-2025.9.8 → parsl-2025.9.15}/parsl.egg-info/requires.txt +0 -0
  470. {parsl-2025.9.8 → parsl-2025.9.15}/parsl.egg-info/top_level.txt +0 -0
  471. {parsl-2025.9.8 → parsl-2025.9.15}/requirements.txt +0 -0
  472. {parsl-2025.9.8 → parsl-2025.9.15}/setup.cfg +0 -0
  473. {parsl-2025.9.8 → parsl-2025.9.15}/setup.py +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: parsl
3
- Version: 2025.9.8
3
+ Version: 2025.9.15
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.08.tar.gz
6
+ Download-URL: https://github.com/Parsl/parsl/archive/2025.09.15.tar.gz
7
7
  Author: The Parsl Team
8
8
  Author-email: parsl@googlegroups.com
9
9
  License: Apache 2.0
@@ -101,17 +101,6 @@ class BaseContext(metaclass=ABCMeta):
101
101
  """
102
102
  self._ctx.destroy(linger)
103
103
 
104
- def recreate(self, linger: Optional[int] = None):
105
- """Destroy then recreate the context.
106
-
107
- Parameters
108
- ----------
109
- linger : int, optional
110
- If specified, set LINGER on sockets prior to closing them.
111
- """
112
- self.destroy(linger)
113
- self._ctx = zmq.Context()
114
-
115
104
 
116
105
  class ServerContext(BaseContext):
117
106
  """CurveZMQ server context
@@ -175,11 +164,6 @@ class ServerContext(BaseContext):
175
164
  self.auth_thread.stop()
176
165
  super().destroy(linger)
177
166
 
178
- def recreate(self, linger: Optional[int] = None):
179
- super().recreate(linger)
180
- if self.auth_thread:
181
- self.auth_thread = self._start_auth_thread()
182
-
183
167
 
184
168
  class ClientContext(BaseContext):
185
169
  """CurveZMQ client context
@@ -332,6 +332,13 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
332
332
  self.encrypted = encrypted
333
333
  self.cert_dir = None
334
334
 
335
+ # This flag will enable/disable internal Python mismatch checks
336
+ # between the interchange and worker managers. This serves as a
337
+ # temporary workaround for Globus Compute to support different
338
+ # Python versions at the endpoint and worker layers. We can drop
339
+ # the flag once we implement modular internal message protocols.
340
+ self._check_python_mismatch: bool = True
341
+
335
342
  if not launch_cmd:
336
343
  launch_cmd = DEFAULT_LAUNCH_CMD
337
344
  self.launch_cmd = launch_cmd
@@ -568,6 +575,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
568
575
  "cert_dir": self.cert_dir,
569
576
  "manager_selector": self.manager_selector,
570
577
  "run_id": self.run_id,
578
+ "_check_python_mismatch": self._check_python_mismatch,
571
579
  }
572
580
 
573
581
  config_pickle = pickle.dumps(interchange_config)
@@ -56,6 +56,7 @@ class Interchange:
56
56
  cert_dir: Optional[str],
57
57
  manager_selector: ManagerSelector,
58
58
  run_id: str,
59
+ _check_python_mismatch: bool,
59
60
  ) -> None:
60
61
  """
61
62
  Parameters
@@ -99,6 +100,11 @@ class Interchange:
99
100
 
100
101
  cert_dir : str | None
101
102
  Path to the certificate directory.
103
+
104
+ _check_python_mismatch : bool
105
+ If True, the interchange and worker managers must run the same version of
106
+ Python. Running different versions can cause inter-process communication
107
+ errors, so proceed with caution.
102
108
  """
103
109
  self.cert_dir = cert_dir
104
110
  self.logdir = logdir
@@ -126,6 +132,7 @@ class Interchange:
126
132
  logger.info("Connected to client")
127
133
 
128
134
  self.run_id = run_id
135
+ self._check_python_mismatch = _check_python_mismatch
129
136
 
130
137
  self.hub_address = hub_address
131
138
  self.hub_zmq_port = hub_zmq_port
@@ -396,7 +403,9 @@ class Interchange:
396
403
  logger.info(f'Registration info for manager {manager_id!r}: {meta}')
397
404
  self._send_monitoring_info(monitoring_radio, new_rec)
398
405
 
399
- if (mgr_minor_py, mgr_parsl_v) != (ix_minor_py, ix_parsl_v):
406
+ python_mismatch: bool = ix_minor_py != mgr_minor_py
407
+ parsl_mismatch: bool = ix_parsl_v != mgr_parsl_v
408
+ if parsl_mismatch or (self._check_python_mismatch and python_mismatch):
400
409
  kill_event.set()
401
410
  vm_exc = VersionMismatch(
402
411
  f"py.v={ix_minor_py} parsl.v={ix_parsl_v}",
@@ -74,51 +74,37 @@ class CommandClient:
74
74
 
75
75
  reply = '__PARSL_ZMQ_PIPES_MAGIC__'
76
76
  with self._lock:
77
- for _ in range(max_retries):
78
- try:
79
- logger.debug("Sending command client command")
80
-
81
- if timeout_s is not None:
82
- remaining_time_s = start_time_s + timeout_s - time.monotonic()
83
- poll_result = self.zmq_socket.poll(timeout=remaining_time_s * 1000, flags=zmq.POLLOUT)
84
- if poll_result == zmq.POLLOUT:
85
- pass # this is OK, so continue
86
- elif poll_result == 0:
87
- raise CommandClientTimeoutError("Waiting for command channel to be ready for a command")
88
- else:
89
- raise InternalConsistencyError(f"ZMQ poll returned unexpected value: {poll_result}")
90
-
91
- self.zmq_socket.send_pyobj(message, copy=True)
92
-
93
- if timeout_s is not None:
94
- logger.debug("Polling for command client response or timeout")
95
- remaining_time_s = start_time_s + timeout_s - time.monotonic()
96
- poll_result = self.zmq_socket.poll(timeout=remaining_time_s * 1000, flags=zmq.POLLIN)
97
- if poll_result == zmq.POLLIN:
98
- pass # this is OK, so continue
99
- elif poll_result == 0:
100
- logger.error("Command timed-out - command client is now bad forever")
101
- self.ok = False
102
- raise CommandClientTimeoutError("Waiting for a reply from command channel")
103
- else:
104
- raise InternalConsistencyError(f"ZMQ poll returned unexpected value: {poll_result}")
105
-
106
- logger.debug("Receiving command client response")
107
- reply = self.zmq_socket.recv_pyobj()
108
- logger.debug("Received command client response")
109
- except zmq.ZMQError:
110
- logger.exception("Potential ZMQ REQ-REP deadlock caught")
111
- logger.info("Trying to reestablish context")
112
- self.zmq_context.recreate()
113
- self.create_socket_and_bind()
77
+ logger.debug("Sending command client command")
78
+
79
+ if timeout_s is not None:
80
+ remaining_time_s = start_time_s + timeout_s - time.monotonic()
81
+ poll_result = self.zmq_socket.poll(timeout=remaining_time_s * 1000, flags=zmq.POLLOUT)
82
+ if poll_result == zmq.POLLOUT:
83
+ pass # this is OK, so continue
84
+ elif poll_result == 0:
85
+ raise CommandClientTimeoutError("Waiting for command channel to be ready for a command")
114
86
  else:
115
- break
116
-
117
- if reply == '__PARSL_ZMQ_PIPES_MAGIC__':
118
- logger.error("Command channel run retries exhausted. Unable to run command")
119
- raise Exception("Command Channel retries exhausted")
87
+ raise InternalConsistencyError(f"ZMQ poll returned unexpected value: {poll_result}")
88
+
89
+ self.zmq_socket.send_pyobj(message, copy=True)
90
+
91
+ if timeout_s is not None:
92
+ logger.debug("Polling for command client response or timeout")
93
+ remaining_time_s = start_time_s + timeout_s - time.monotonic()
94
+ poll_result = self.zmq_socket.poll(timeout=remaining_time_s * 1000, flags=zmq.POLLIN)
95
+ if poll_result == zmq.POLLIN:
96
+ pass # this is OK, so continue
97
+ elif poll_result == 0:
98
+ logger.error("Command timed-out - command client is now bad forever")
99
+ self.ok = False
100
+ raise CommandClientTimeoutError("Waiting for a reply from command channel")
101
+ else:
102
+ raise InternalConsistencyError(f"ZMQ poll returned unexpected value: {poll_result}")
120
103
 
121
- return reply
104
+ logger.debug("Receiving command client response")
105
+ reply = self.zmq_socket.recv_pyobj()
106
+ logger.debug("Received command client response")
107
+ return reply
122
108
 
123
109
  def close(self):
124
110
  self.zmq_socket.close()
@@ -11,9 +11,9 @@ import typeguard
11
11
 
12
12
  from parsl.monitoring.types import TaggedMonitoringMessage
13
13
  from parsl.multiprocessing import (
14
- SizedQueue,
15
14
  SpawnEvent,
16
15
  SpawnProcess,
16
+ SpawnQueue,
17
17
  join_terminate_close_proc,
18
18
  )
19
19
  from parsl.utils import RepresentationMixin
@@ -126,7 +126,7 @@ class MonitoringHub(RepresentationMixin):
126
126
  self.monitoring_hub_active = True
127
127
 
128
128
  self.resource_msgs: Queue[TaggedMonitoringMessage]
129
- self.resource_msgs = SizedQueue()
129
+ self.resource_msgs = SpawnQueue()
130
130
 
131
131
  self.dbm_exit_event: ms.Event
132
132
  self.dbm_exit_event = SpawnEvent()
@@ -4,7 +4,6 @@
4
4
  import logging
5
5
  import multiprocessing
6
6
  import multiprocessing.queues
7
- import platform
8
7
  from multiprocessing.context import ForkProcess as ForkProcessType
9
8
  from multiprocessing.context import SpawnProcess as SpawnProcessType
10
9
  from typing import Callable
@@ -21,54 +20,6 @@ SpawnEvent = SpawnContext.Event
21
20
  SpawnQueue = SpawnContext.Queue
22
21
 
23
22
 
24
- class MacSafeQueue(multiprocessing.queues.Queue):
25
- """ Multiprocessing queues do not have qsize attributes on MacOS.
26
- This is slower but more portable version of the multiprocessing Queue
27
- that adds a explicit counter
28
-
29
- Reference : https://github.com/keras-team/autokeras/commit/4ddd568b06b4045ace777bc0fb7bc18573b85a75
30
- """
31
-
32
- def __init__(self, *args, **kwargs):
33
- if 'ctx' not in kwargs:
34
- kwargs['ctx'] = multiprocessing.get_context('spawn')
35
- super().__init__(*args, **kwargs)
36
- self._counter = multiprocessing.Value('i', 0)
37
-
38
- def put(self, *args, **kwargs):
39
- # logger.critical("Putting item {}".format(args))
40
- x = super().put(*args, **kwargs)
41
- with self._counter.get_lock():
42
- self._counter.value += 1
43
- return x
44
-
45
- def get(self, *args, **kwargs):
46
- x = super().get(*args, **kwargs)
47
- with self._counter.get_lock():
48
- self._counter.value -= 1
49
- # logger.critical("Getting item {}".format(x))
50
- return x
51
-
52
- def qsize(self):
53
- return self._counter.value
54
-
55
- def empty(self):
56
- return not self._counter.value
57
-
58
-
59
- # SizedQueue should be constructable using the same calling
60
- # convention as multiprocessing.Queue but that entire signature
61
- # isn't expressible in mypy 0.790
62
- SizedQueue: Callable[..., multiprocessing.Queue]
63
-
64
-
65
- if platform.system() != 'Darwin':
66
- import multiprocessing
67
- SizedQueue = SpawnQueue
68
- else:
69
- SizedQueue = MacSafeQueue
70
-
71
-
72
23
  def join_terminate_close_proc(process: SpawnProcessType, *, timeout: int = 30) -> None:
73
24
  """Increasingly aggressively terminate a process.
74
25
 
@@ -296,48 +296,6 @@ def test_server_context_destroy(server_ctx: curvezmq.ServerContext, encrypted: b
296
296
  assert not server_ctx.auth_thread.pipe
297
297
 
298
298
 
299
- @pytest.mark.local
300
- @pytest.mark.parametrize("encrypted", (True, False), indirect=True)
301
- def test_client_context_recreate(client_ctx: curvezmq.ClientContext):
302
- hidden_ctx = client_ctx._ctx
303
- sock = client_ctx.socket(zmq.REQ)
304
-
305
- assert not sock.closed
306
- assert not client_ctx.closed
307
-
308
- client_ctx.recreate()
309
-
310
- assert sock.closed
311
- assert not client_ctx.closed
312
- assert hidden_ctx != client_ctx._ctx
313
- assert hidden_ctx.closed
314
-
315
-
316
- @pytest.mark.local
317
- @pytest.mark.parametrize("encrypted", (True, False), indirect=True)
318
- def test_server_context_recreate(server_ctx: curvezmq.ServerContext, encrypted: bool):
319
- hidden_ctx = server_ctx._ctx
320
- sock = server_ctx.socket(zmq.REP)
321
-
322
- assert not sock.closed
323
- assert not server_ctx.closed
324
- if encrypted:
325
- assert server_ctx.auth_thread
326
- auth_thread = server_ctx.auth_thread
327
- assert auth_thread.pipe
328
-
329
- server_ctx.recreate()
330
-
331
- assert sock.closed
332
- assert not server_ctx.closed
333
- assert hidden_ctx.closed
334
- assert hidden_ctx != server_ctx._ctx
335
- if encrypted:
336
- assert server_ctx.auth_thread
337
- assert auth_thread != server_ctx.auth_thread
338
- assert server_ctx.auth_thread.pipe
339
-
340
-
341
299
  @pytest.mark.local
342
300
  @pytest.mark.parametrize("encrypted", (True, False), indirect=True)
343
301
  def test_connection(
@@ -0,0 +1,54 @@
1
+ import time
2
+ from threading import Event, Thread
3
+
4
+ import pytest
5
+
6
+ import parsl
7
+ from parsl.tests.configs.htex_local import fresh_config as local_config
8
+
9
+ N_THREADS = 50
10
+ DURATION_S = 10
11
+
12
+
13
+ @pytest.mark.local
14
+ def test_concurrency_blast():
15
+ """Blast interchange command channel from many threads.
16
+ """
17
+
18
+ cc = parsl.dfk().executors['htex_local'].command_client
19
+
20
+ threads = []
21
+
22
+ ok_so_far = True
23
+
24
+ for _ in range(N_THREADS):
25
+
26
+ # This event will be set if the thread reaches the end of its body.
27
+ event = Event()
28
+
29
+ thread = Thread(target=blast, args=(cc, event))
30
+ threads.append((thread, event))
31
+
32
+ for thread, event in threads:
33
+ thread.start()
34
+
35
+ for thread, event in threads:
36
+ thread.join()
37
+ if not event.is_set():
38
+ ok_so_far = False
39
+
40
+ assert ok_so_far, "at least one thread did not exit normally"
41
+
42
+
43
+ def blast(cc, e):
44
+ target_end = time.monotonic() + DURATION_S
45
+
46
+ while time.monotonic() < target_end:
47
+ cc.run("WORKERS")
48
+ cc.run("MANGERs_PACKAGES")
49
+ cc.run("CONNECTED_BLOCKS")
50
+ cc.run("WORKER_BINDS")
51
+
52
+ # If any of the preceeding cc.run calls raises an exception, the thread
53
+ # will not set its successful completion event.
54
+ e.set()
@@ -50,7 +50,8 @@ def test_exit_with_bad_registration(tmpd_cwd, try_assert):
50
50
  "logging_level": logging.DEBUG,
51
51
  "cert_dir": None,
52
52
  "manager_selector": RandomManagerSelector(),
53
- "run_id": "test"
53
+ "run_id": "test",
54
+ "_check_python_mismatch": True,
54
55
  }
55
56
 
56
57
  config_pickle = pickle.dumps(interchange_config)
@@ -46,6 +46,7 @@ def test_priority_queue():
46
46
  futures[(priority, i)] = fake_task(parsl_resource_specification=spec)
47
47
 
48
48
  provider.max_blocks = 1
49
+ htex.scale_out_facade(1) # don't wait for the JSP to catch up
49
50
 
50
51
  # Wait for completion
51
52
  results = {
@@ -29,7 +29,8 @@ def make_interchange(*,
29
29
  logging_level=logging.INFO,
30
30
  manager_selector=RandomManagerSelector(),
31
31
  poll_period=10,
32
- run_id="test_run_id")
32
+ run_id="test_run_id",
33
+ _check_python_mismatch=True)
33
34
 
34
35
 
35
36
  @pytest.fixture
@@ -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.08'
6
+ VERSION = '2025.09.15'
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: parsl
3
- Version: 2025.9.8
3
+ Version: 2025.9.15
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.08.tar.gz
6
+ Download-URL: https://github.com/Parsl/parsl/archive/2025.09.15.tar.gz
7
7
  Author: The Parsl Team
8
8
  Author-email: parsl@googlegroups.com
9
9
  License: Apache 2.0
@@ -210,7 +210,6 @@ parsl/serialize/proxystore.py
210
210
  parsl/tests/__init__.py
211
211
  parsl/tests/callables_helper.py
212
212
  parsl/tests/conftest.py
213
- parsl/tests/test_aalst_patterns.py
214
213
  parsl/tests/test_callables.py
215
214
  parsl/tests/test_curvezmq.py
216
215
  parsl/tests/test_execute_task.py
@@ -269,8 +268,6 @@ parsl/tests/manual_tests/test_regression_220.py
269
268
  parsl/tests/manual_tests/test_worker_count.py
270
269
  parsl/tests/site_tests/__init__.py
271
270
  parsl/tests/site_tests/site_config_selector.py
272
- parsl/tests/site_tests/test_provider.py
273
- parsl/tests/site_tests/test_site.py
274
271
  parsl/tests/sites/__init__.py
275
272
  parsl/tests/sites/test_affinity.py
276
273
  parsl/tests/sites/test_concurrent.py
@@ -306,12 +303,10 @@ parsl/tests/test_docs/test_from_slides.py
306
303
  parsl/tests/test_docs/test_kwargs.py
307
304
  parsl/tests/test_docs/test_tutorial_1.py
308
305
  parsl/tests/test_docs/test_workflow1.py
309
- parsl/tests/test_docs/test_workflow2.py
310
306
  parsl/tests/test_docs/test_workflow4.py
311
307
  parsl/tests/test_error_handling/__init__.py
312
308
  parsl/tests/test_error_handling/test_fail.py
313
309
  parsl/tests/test_error_handling/test_python_walltime.py
314
- parsl/tests/test_error_handling/test_rand_fail.py
315
310
  parsl/tests/test_error_handling/test_resource_spec.py
316
311
  parsl/tests/test_error_handling/test_retries.py
317
312
  parsl/tests/test_error_handling/test_retry_handler.py
@@ -323,6 +318,7 @@ parsl/tests/test_htex/__init__.py
323
318
  parsl/tests/test_htex/test_basic.py
324
319
  parsl/tests/test_htex/test_block_manager_selector_unit.py
325
320
  parsl/tests/test_htex/test_command_client_timeout.py
321
+ parsl/tests/test_htex/test_command_concurrency_regression_1321.py
326
322
  parsl/tests/test_htex/test_connected_blocks.py
327
323
  parsl/tests/test_htex/test_cpu_affinity_explicit.py
328
324
  parsl/tests/test_htex/test_disconnected_blocks.py
@@ -410,7 +406,6 @@ parsl/tests/test_regression/test_221.py
410
406
  parsl/tests/test_regression/test_226.py
411
407
  parsl/tests/test_regression/test_2652.py
412
408
  parsl/tests/test_regression/test_69a.py
413
- parsl/tests/test_regression/test_854.py
414
409
  parsl/tests/test_regression/test_97_parallelism_0.py
415
410
  parsl/tests/test_regression/test_98.py
416
411
  parsl/tests/test_scaling/__init__.py
@@ -1,88 +0,0 @@
1
- import argparse
2
- import logging
3
- import time
4
-
5
- import pytest
6
-
7
- import parsl
8
- from parsl.app.app import python_app # , bash_app
9
- from parsl.jobs.states import JobState
10
- from parsl.tests.site_tests.site_config_selector import fresh_config
11
-
12
- logger = logging.getLogger(__name__)
13
-
14
-
15
- @python_app
16
- def platform(sleep=10, stdout=None):
17
- import time
18
- time.sleep(sleep)
19
- return True
20
-
21
-
22
- @pytest.mark.local
23
- @pytest.mark.skip("This test cannot run on sites which cannot be identified by site_config_selector")
24
- def test_provider():
25
- """ Provider scaling
26
- """
27
- logger.info("Starting test_provider")
28
- config = fresh_config()
29
- name = config.executors[0].label
30
- parsl.load(config)
31
-
32
- dfk = parsl.dfk()
33
- logger.info("Trying to get executor : {}".format(name))
34
-
35
- x = platform(sleep=0)
36
- logger.info("Result is {}".format(x.result()))
37
-
38
- executor = dfk.executors[name]
39
- provider = dfk.executors[name].provider
40
-
41
- # At this point we should have 1 job
42
- _, current_jobs = executor._get_block_and_job_ids()
43
- assert len(current_jobs) == 1, "Expected 1 job at init, got {}".format(len(current_jobs))
44
-
45
- logger.info("Getting provider status (1)")
46
- status = provider.status(current_jobs)
47
- logger.info("Got provider status")
48
- assert status[0].state == JobState.RUNNING, "Expected job to be in state RUNNING"
49
-
50
- # Scale down to 0
51
- scale_in_blocks = executor.scale_in(blocks=1)
52
- logger.info("Now sleeping 60 seconds")
53
- time.sleep(60)
54
- logger.info("Sleep finished")
55
- logger.info("Getting provider status (2)")
56
- status = executor.status()
57
- logger.info("Got executor status")
58
- logger.info("Block status: {}".format(status))
59
- assert status[scale_in_blocks[0]].terminal is True, "Terminal state"
60
- logger.info("Job in terminal state")
61
-
62
- _, current_jobs = executor._get_block_and_job_ids()
63
- # PR 1952 stoped removing scale_in blocks from self.blocks_to_job_id
64
- # A new PR will handle removing blocks from self.block
65
- # this includes failed/completed/canceled blocks
66
- assert len(current_jobs) == 1, "Expected current_jobs == 1"
67
- dfk.cleanup()
68
- parsl.clear()
69
- logger.info("Ended test_provider")
70
- return True
71
-
72
-
73
- if __name__ == '__main__':
74
-
75
- parser = argparse.ArgumentParser()
76
- parser.add_argument("-c", "--count", default="4",
77
- help="Count of apps to launch")
78
- parser.add_argument("-t", "--time", default="60",
79
- help="Sleep time for each app")
80
-
81
- parser.add_argument("-d", "--debug", action='store_true',
82
- help="Count of apps to launch")
83
- args = parser.parse_args()
84
-
85
- if args.debug:
86
- parsl.set_stream_logger()
87
-
88
- x = test_provider()
@@ -1,70 +0,0 @@
1
- import argparse
2
-
3
- import pytest
4
-
5
- import parsl
6
- from parsl.app.app import python_app
7
- from parsl.tests.site_tests.site_config_selector import fresh_config
8
-
9
-
10
- @python_app
11
- def platform(sleep=10, stdout=None):
12
- import platform
13
- import time
14
- time.sleep(sleep)
15
- return platform.uname()
16
-
17
-
18
- @pytest.mark.local
19
- @pytest.mark.skip("The behaviour this test is testing is unclear: there is no guarantee that tasks will go to different nodes")
20
- def test_platform(n=2, sleep_dur=10):
21
- """ This should sleep to make sure that concurrent apps will go to different workers
22
- on different nodes.
23
- """
24
- config = fresh_config()
25
- if config.executors[0].label == "htex_local":
26
- return
27
-
28
- parsl.load(fresh_config())
29
-
30
- dfk = parsl.dfk()
31
- name = list(dfk.executors.keys())[0]
32
- print("Trying to get executor : ", name)
33
-
34
- x = [platform(sleep=1) for i in range(2)]
35
- print([i.result() for i in x])
36
-
37
- print("Executor : ", dfk.executors[name])
38
- print("Connected : ", dfk.executors[name].connected_workers())
39
- print("Outstanding : ", dfk.executors[name].outstanding())
40
-
41
- d = []
42
- for i in range(0, n):
43
- x = platform(sleep=sleep_dur)
44
- d.append(x)
45
-
46
- pinfo = set([i.result()for i in d])
47
- assert len(pinfo) == 2, "Expected two nodes, instead got {}".format(pinfo)
48
-
49
- print("Test passed")
50
-
51
- dfk.cleanup()
52
- parsl.clear()
53
- return True
54
-
55
-
56
- if __name__ == '__main__':
57
-
58
- parser = argparse.ArgumentParser()
59
- parser.add_argument("-c", "--count", default="4",
60
- help="Count of apps to launch")
61
- parser.add_argument("-t", "--time", default="60",
62
- help="Sleep time for each app")
63
- parser.add_argument("-d", "--debug", action='store_true',
64
- help="Count of apps to launch")
65
- args = parser.parse_args()
66
-
67
- if args.debug:
68
- parsl.set_stream_logger()
69
-
70
- x = test_platform(n=int(args.count), sleep_dur=int(args.time))