parsl 2024.5.13__tar.gz → 2024.5.20__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.
Files changed (473) hide show
  1. {parsl-2024.5.13/parsl.egg-info → parsl-2024.5.20}/PKG-INFO +2 -2
  2. {parsl-2024.5.13 → parsl-2024.5.20}/README.rst +7 -5
  3. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/channels/base.py +2 -9
  4. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/channels/local/local.py +3 -6
  5. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/channels/oauth_ssh/oauth_ssh.py +2 -2
  6. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/channels/ssh/ssh.py +2 -2
  7. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/dataflow/dflow.py +1 -1
  8. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/__init__.py +2 -0
  9. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/base.py +7 -7
  10. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/high_throughput/executor.py +83 -83
  11. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/high_throughput/interchange.py +6 -5
  12. parsl-2024.5.20/parsl/executors/high_throughput/mpi_executor.py +85 -0
  13. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/high_throughput/mpi_resource_management.py +3 -0
  14. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/remote.py +18 -24
  15. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/local/local.py +1 -1
  16. parsl-2024.5.20/parsl/tests/test_mpi_apps/test_bad_mpi_config.py +33 -0
  17. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_mpi_apps/test_mpi_mode_disabled.py +0 -1
  18. parsl-2024.5.20/parsl/tests/test_mpi_apps/test_mpiex.py +64 -0
  19. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/version.py +1 -1
  20. {parsl-2024.5.13 → parsl-2024.5.20/parsl.egg-info}/PKG-INFO +2 -2
  21. {parsl-2024.5.13 → parsl-2024.5.20}/parsl.egg-info/SOURCES.txt +2 -0
  22. {parsl-2024.5.13 → parsl-2024.5.20}/parsl.egg-info/requires.txt +2 -0
  23. {parsl-2024.5.13 → parsl-2024.5.20}/setup.py +1 -1
  24. parsl-2024.5.13/parsl/tests/test_mpi_apps/test_bad_mpi_config.py +0 -41
  25. {parsl-2024.5.13 → parsl-2024.5.20}/LICENSE +0 -0
  26. {parsl-2024.5.13 → parsl-2024.5.20}/MANIFEST.in +0 -0
  27. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/__init__.py +0 -0
  28. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/addresses.py +0 -0
  29. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/app/__init__.py +0 -0
  30. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/app/app.py +0 -0
  31. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/app/bash.py +0 -0
  32. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/app/errors.py +0 -0
  33. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/app/futures.py +0 -0
  34. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/app/python.py +0 -0
  35. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/benchmark/__init__.py +0 -0
  36. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/benchmark/perf.py +0 -0
  37. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/channels/__init__.py +0 -0
  38. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/channels/errors.py +0 -0
  39. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/channels/local/__init__.py +0 -0
  40. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/channels/oauth_ssh/__init__.py +0 -0
  41. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/channels/ssh/__init__.py +0 -0
  42. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/channels/ssh_il/__init__.py +0 -0
  43. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/channels/ssh_il/ssh_il.py +0 -0
  44. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/concurrent/__init__.py +0 -0
  45. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/config.py +0 -0
  46. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/ASPIRE1.py +0 -0
  47. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/Azure.py +0 -0
  48. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/__init__.py +0 -0
  49. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/ad_hoc.py +0 -0
  50. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/bridges.py +0 -0
  51. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/cc_in2p3.py +0 -0
  52. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/ec2.py +0 -0
  53. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/expanse.py +0 -0
  54. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/frontera.py +0 -0
  55. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/htex_local.py +0 -0
  56. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/illinoiscluster.py +0 -0
  57. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/kubernetes.py +0 -0
  58. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/local_threads.py +0 -0
  59. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/midway.py +0 -0
  60. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/osg.py +0 -0
  61. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/polaris.py +0 -0
  62. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/stampede2.py +0 -0
  63. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/summit.py +0 -0
  64. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/toss3_llnl.py +0 -0
  65. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/vineex_local.py +0 -0
  66. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/configs/wqex_local.py +0 -0
  67. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/curvezmq.py +0 -0
  68. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/data_provider/__init__.py +0 -0
  69. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/data_provider/data_manager.py +0 -0
  70. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/data_provider/file_noop.py +0 -0
  71. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/data_provider/files.py +0 -0
  72. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/data_provider/ftp.py +0 -0
  73. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/data_provider/globus.py +0 -0
  74. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/data_provider/http.py +0 -0
  75. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/data_provider/rsync.py +0 -0
  76. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/data_provider/staging.py +0 -0
  77. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/data_provider/zip.py +0 -0
  78. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/dataflow/__init__.py +0 -0
  79. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/dataflow/errors.py +0 -0
  80. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/dataflow/futures.py +0 -0
  81. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/dataflow/memoization.py +0 -0
  82. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/dataflow/rundirs.py +0 -0
  83. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/dataflow/states.py +0 -0
  84. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/dataflow/taskrecord.py +0 -0
  85. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/errors.py +0 -0
  86. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/errors.py +0 -0
  87. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/flux/__init__.py +0 -0
  88. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/flux/execute_parsl_task.py +0 -0
  89. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/flux/executor.py +0 -0
  90. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/flux/flux_instance_manager.py +0 -0
  91. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/high_throughput/__init__.py +0 -0
  92. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/high_throughput/errors.py +0 -0
  93. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/high_throughput/manager_record.py +0 -0
  94. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/high_throughput/monitoring_info.py +0 -0
  95. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/high_throughput/mpi_prefix_composer.py +0 -0
  96. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/high_throughput/probe.py +0 -0
  97. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/high_throughput/process_worker_pool.py +0 -0
  98. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/high_throughput/zmq_pipes.py +0 -0
  99. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/radical/__init__.py +0 -0
  100. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/radical/executor.py +0 -0
  101. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/radical/rpex_master.py +0 -0
  102. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/radical/rpex_resources.py +0 -0
  103. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/radical/rpex_worker.py +0 -0
  104. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/status_handling.py +0 -0
  105. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/taskvine/__init__.py +0 -0
  106. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/taskvine/errors.py +0 -0
  107. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/taskvine/exec_parsl_function.py +0 -0
  108. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/taskvine/executor.py +0 -0
  109. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/taskvine/factory.py +0 -0
  110. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/taskvine/factory_config.py +0 -0
  111. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/taskvine/manager.py +0 -0
  112. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/taskvine/manager_config.py +0 -0
  113. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/taskvine/utils.py +0 -0
  114. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/threads.py +0 -0
  115. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/workqueue/__init__.py +0 -0
  116. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/workqueue/errors.py +0 -0
  117. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/workqueue/exec_parsl_function.py +0 -0
  118. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/workqueue/executor.py +0 -0
  119. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/workqueue/parsl_coprocess.py +0 -0
  120. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
  121. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/jobs/__init__.py +0 -0
  122. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/jobs/error_handlers.py +0 -0
  123. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/jobs/errors.py +0 -0
  124. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/jobs/job_status_poller.py +0 -0
  125. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/jobs/states.py +0 -0
  126. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/jobs/strategy.py +0 -0
  127. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/launchers/__init__.py +0 -0
  128. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/launchers/base.py +0 -0
  129. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/launchers/errors.py +0 -0
  130. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/launchers/launchers.py +0 -0
  131. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/log_utils.py +0 -0
  132. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/__init__.py +0 -0
  133. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/db_manager.py +0 -0
  134. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/message_type.py +0 -0
  135. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/monitoring.py +0 -0
  136. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/queries/__init__.py +0 -0
  137. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/queries/pandas.py +0 -0
  138. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/radios.py +0 -0
  139. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/router.py +0 -0
  140. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/types.py +0 -0
  141. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/__init__.py +0 -0
  142. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/app.py +0 -0
  143. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/models.py +0 -0
  144. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/plots/__init__.py +0 -0
  145. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
  146. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
  147. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/plots/default/workflow_plots.py +0 -0
  148. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +0 -0
  149. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
  150. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
  151. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/templates/app.html +0 -0
  152. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/templates/dag.html +0 -0
  153. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/templates/error.html +0 -0
  154. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/templates/layout.html +0 -0
  155. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
  156. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/templates/task.html +0 -0
  157. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/templates/workflow.html +0 -0
  158. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
  159. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/utils.py +0 -0
  160. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/version.py +0 -0
  161. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/monitoring/visualization/views.py +0 -0
  162. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/multiprocessing.py +0 -0
  163. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/process_loggers.py +0 -0
  164. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/__init__.py +0 -0
  165. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/ad_hoc/__init__.py +0 -0
  166. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/ad_hoc/ad_hoc.py +0 -0
  167. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/aws/__init__.py +0 -0
  168. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/aws/aws.py +0 -0
  169. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/aws/template.py +0 -0
  170. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/azure/__init__.py +0 -0
  171. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/azure/azure.py +0 -0
  172. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/azure/template.py +0 -0
  173. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/base.py +0 -0
  174. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/cluster_provider.py +0 -0
  175. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/cobalt/__init__.py +0 -0
  176. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/cobalt/cobalt.py +0 -0
  177. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/cobalt/template.py +0 -0
  178. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/condor/__init__.py +0 -0
  179. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/condor/condor.py +0 -0
  180. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/condor/template.py +0 -0
  181. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/errors.py +0 -0
  182. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/googlecloud/__init__.py +0 -0
  183. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/googlecloud/googlecloud.py +0 -0
  184. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/grid_engine/__init__.py +0 -0
  185. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/grid_engine/grid_engine.py +0 -0
  186. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/grid_engine/template.py +0 -0
  187. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/kubernetes/__init__.py +0 -0
  188. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/kubernetes/kube.py +0 -0
  189. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/kubernetes/template.py +0 -0
  190. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/local/__init__.py +0 -0
  191. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/lsf/__init__.py +0 -0
  192. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/lsf/lsf.py +0 -0
  193. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/lsf/template.py +0 -0
  194. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/pbspro/__init__.py +0 -0
  195. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/pbspro/pbspro.py +0 -0
  196. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/pbspro/template.py +0 -0
  197. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/slurm/__init__.py +0 -0
  198. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/slurm/slurm.py +0 -0
  199. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/slurm/template.py +0 -0
  200. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/torque/__init__.py +0 -0
  201. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/torque/template.py +0 -0
  202. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/providers/torque/torque.py +0 -0
  203. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/py.typed +0 -0
  204. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/serialize/__init__.py +0 -0
  205. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/serialize/base.py +0 -0
  206. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/serialize/concretes.py +0 -0
  207. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/serialize/errors.py +0 -0
  208. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/serialize/facade.py +0 -0
  209. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/serialize/proxystore.py +0 -0
  210. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/__init__.py +0 -0
  211. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/callables_helper.py +0 -0
  212. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/__init__.py +0 -0
  213. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/ad_hoc_cluster_htex.py +0 -0
  214. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/azure_single_node.py +0 -0
  215. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/bluewaters.py +0 -0
  216. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/bridges.py +0 -0
  217. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/cc_in2p3.py +0 -0
  218. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/comet.py +0 -0
  219. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/cooley_htex.py +0 -0
  220. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/ec2_single_node.py +0 -0
  221. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/ec2_spot.py +0 -0
  222. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/frontera.py +0 -0
  223. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/htex_ad_hoc_cluster.py +0 -0
  224. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/htex_local.py +0 -0
  225. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/htex_local_alternate.py +0 -0
  226. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/htex_local_intask_staging.py +0 -0
  227. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/htex_local_rsync_staging.py +0 -0
  228. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/local_adhoc.py +0 -0
  229. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/local_radical.py +0 -0
  230. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/local_radical_mpi.py +0 -0
  231. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/local_threads.py +0 -0
  232. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
  233. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
  234. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/local_threads_checkpoint_periodic.py +0 -0
  235. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
  236. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
  237. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/local_threads_globus.py +0 -0
  238. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
  239. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/local_threads_monitoring.py +0 -0
  240. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/local_threads_no_cache.py +0 -0
  241. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/midway.py +0 -0
  242. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/nscc_singapore.py +0 -0
  243. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/osg_htex.py +0 -0
  244. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/petrelkube.py +0 -0
  245. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/summit.py +0 -0
  246. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/swan_htex.py +0 -0
  247. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/taskvine_ex.py +0 -0
  248. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/theta.py +0 -0
  249. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/user_opts.py +0 -0
  250. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/configs/workqueue_ex.py +0 -0
  251. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/conftest.py +0 -0
  252. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/integration/__init__.py +0 -0
  253. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/integration/latency.py +0 -0
  254. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/integration/test_apps/__init__.py +0 -0
  255. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/integration/test_channels/__init__.py +0 -0
  256. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/integration/test_channels/test_channels.py +0 -0
  257. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/integration/test_channels/test_local_channel.py +0 -0
  258. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/integration/test_channels/test_scp_1.py +0 -0
  259. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/integration/test_channels/test_ssh_1.py +0 -0
  260. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/integration/test_channels/test_ssh_errors.py +0 -0
  261. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/integration/test_channels/test_ssh_file_transport.py +0 -0
  262. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/integration/test_channels/test_ssh_interactive.py +0 -0
  263. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
  264. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/integration/test_stress/__init__.py +0 -0
  265. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
  266. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
  267. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/manual_tests/__init__.py +0 -0
  268. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/manual_tests/htex_local.py +0 -0
  269. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/manual_tests/test_ad_hoc_htex.py +0 -0
  270. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/manual_tests/test_basic.py +0 -0
  271. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/manual_tests/test_fan_in_out_htex_remote.py +0 -0
  272. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/manual_tests/test_log_filter.py +0 -0
  273. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/manual_tests/test_memory_limits.py +0 -0
  274. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/manual_tests/test_oauth_ssh.py +0 -0
  275. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/manual_tests/test_regression_220.py +0 -0
  276. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/manual_tests/test_udp_simple.py +0 -0
  277. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/manual_tests/test_worker_count.py +0 -0
  278. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/scaling_tests/__init__.py +0 -0
  279. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/scaling_tests/htex_local.py +0 -0
  280. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/scaling_tests/local_threads.py +0 -0
  281. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/scaling_tests/test_scale.py +0 -0
  282. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/scaling_tests/vineex_condor.py +0 -0
  283. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/scaling_tests/vineex_local.py +0 -0
  284. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/scaling_tests/wqex_condor.py +0 -0
  285. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/scaling_tests/wqex_local.py +0 -0
  286. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/site_tests/__init__.py +0 -0
  287. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/site_tests/site_config_selector.py +0 -0
  288. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/site_tests/test_provider.py +0 -0
  289. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/site_tests/test_site.py +0 -0
  290. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/sites/__init__.py +0 -0
  291. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/sites/test_affinity.py +0 -0
  292. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/sites/test_concurrent.py +0 -0
  293. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/sites/test_dynamic_executor.py +0 -0
  294. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/sites/test_ec2.py +0 -0
  295. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/sites/test_launchers.py +0 -0
  296. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/sites/test_local_adhoc.py +0 -0
  297. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/sites/test_mpi/__init__.py +0 -0
  298. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/sites/test_worker_info.py +0 -0
  299. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_aalst_patterns.py +0 -0
  300. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_bash_apps/__init__.py +0 -0
  301. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
  302. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_bash_apps/test_basic.py +0 -0
  303. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
  304. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
  305. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -0
  306. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_bash_apps/test_memoize.py +0 -0
  307. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
  308. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
  309. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_bash_apps/test_multiline.py +0 -0
  310. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_bash_apps/test_pipeline.py +0 -0
  311. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_bash_apps/test_std_uri.py +0 -0
  312. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_bash_apps/test_stdout.py +0 -0
  313. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_callables.py +0 -0
  314. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_channels/__init__.py +0 -0
  315. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_channels/test_large_output.py +0 -0
  316. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_checkpointing/__init__.py +0 -0
  317. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_checkpointing/test_periodic.py +0 -0
  318. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +0 -0
  319. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
  320. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_checkpointing/test_python_checkpoint_3.py +0 -0
  321. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
  322. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_checkpointing/test_regression_233.py +0 -0
  323. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
  324. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_checkpointing/test_task_exit.py +0 -0
  325. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_curvezmq.py +0 -0
  326. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_docs/__init__.py +0 -0
  327. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_docs/test_from_slides.py +0 -0
  328. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_docs/test_kwargs.py +0 -0
  329. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
  330. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_docs/test_workflow1.py +0 -0
  331. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_docs/test_workflow2.py +0 -0
  332. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_docs/test_workflow4.py +0 -0
  333. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_error_handling/__init__.py +0 -0
  334. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_error_handling/test_fail.py +0 -0
  335. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_error_handling/test_python_walltime.py +0 -0
  336. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_error_handling/test_rand_fail.py +0 -0
  337. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_error_handling/test_resource_spec.py +0 -0
  338. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_error_handling/test_retries.py +0 -0
  339. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
  340. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
  341. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
  342. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
  343. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_flowcontrol/__init__.py +0 -0
  344. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_flux.py +0 -0
  345. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_htex/__init__.py +0 -0
  346. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_htex/test_basic.py +0 -0
  347. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_htex/test_connected_blocks.py +0 -0
  348. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_htex/test_cpu_affinity_explicit.py +0 -0
  349. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_htex/test_disconnected_blocks.py +0 -0
  350. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_htex/test_drain.py +0 -0
  351. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_htex/test_htex.py +0 -0
  352. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_htex/test_manager_failure.py +0 -0
  353. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_htex/test_managers_command.py +0 -0
  354. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_htex/test_missing_worker.py +0 -0
  355. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_htex/test_multiple_disconnected_blocks.py +0 -0
  356. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_htex/test_worker_failure.py +0 -0
  357. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_htex/test_zmq_binding.py +0 -0
  358. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_monitoring/__init__.py +0 -0
  359. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_monitoring/test_app_names.py +0 -0
  360. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_monitoring/test_basic.py +0 -0
  361. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
  362. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_monitoring/test_fuzz_zmq.py +0 -0
  363. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +0 -0
  364. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_monitoring/test_incomplete_futures.py +0 -0
  365. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_monitoring/test_memoization_representation.py +0 -0
  366. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_monitoring/test_stdouterr.py +0 -0
  367. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
  368. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_mpi_apps/__init__.py +0 -0
  369. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +0 -0
  370. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_mpi_apps/test_mpi_prefix.py +0 -0
  371. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_mpi_apps/test_mpi_scheduler.py +0 -0
  372. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_mpi_apps/test_resource_spec.py +0 -0
  373. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_providers/__init__.py +0 -0
  374. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_providers/test_cobalt_deprecation_warning.py +0 -0
  375. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_providers/test_local_provider.py +0 -0
  376. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_providers/test_pbspro_template.py +0 -0
  377. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_providers/test_slurm_instantiate.py +0 -0
  378. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_providers/test_slurm_template.py +0 -0
  379. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_providers/test_submiterror_deprecation.py +0 -0
  380. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/__init__.py +0 -0
  381. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
  382. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_basic.py +0 -0
  383. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_context_manager.py +0 -0
  384. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_dep_standard_futures.py +0 -0
  385. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
  386. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_depfail_propagation.py +0 -0
  387. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_fail.py +0 -0
  388. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
  389. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
  390. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_futures.py +0 -0
  391. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_garbage_collect.py +0 -0
  392. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
  393. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_join.py +0 -0
  394. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_lifted.py +0 -0
  395. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_mapred.py +0 -0
  396. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
  397. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_memoize_2.py +0 -0
  398. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
  399. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +0 -0
  400. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
  401. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
  402. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_outputs.py +0 -0
  403. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_overview.py +0 -0
  404. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_pipeline.py +0 -0
  405. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_simple.py +0 -0
  406. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_timeout.py +0 -0
  407. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_python_apps/test_type5.py +0 -0
  408. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_radical/__init__.py +0 -0
  409. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_radical/test_mpi_funcs.py +0 -0
  410. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_regression/__init__.py +0 -0
  411. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_regression/test_1480.py +0 -0
  412. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +0 -0
  413. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_regression/test_1653.py +0 -0
  414. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_regression/test_221.py +0 -0
  415. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_regression/test_226.py +0 -0
  416. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_regression/test_2652.py +0 -0
  417. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_regression/test_69a.py +0 -0
  418. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_regression/test_854.py +0 -0
  419. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_regression/test_97_parallelism_0.py +0 -0
  420. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_regression/test_98.py +0 -0
  421. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_scaling/__init__.py +0 -0
  422. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_scaling/test_block_error_handler.py +0 -0
  423. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_scaling/test_regression_1621.py +0 -0
  424. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_scaling/test_scale_down.py +0 -0
  425. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +0 -0
  426. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +0 -0
  427. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_scaling/test_shutdown_scalein.py +0 -0
  428. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_serialization/__init__.py +0 -0
  429. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_serialization/test_2555_caching_deserializer.py +0 -0
  430. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_serialization/test_basic.py +0 -0
  431. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_serialization/test_htex_code_cache.py +0 -0
  432. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_serialization/test_pack_resource_spec.py +0 -0
  433. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_serialization/test_proxystore_configured.py +0 -0
  434. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_serialization/test_proxystore_impl.py +0 -0
  435. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_shutdown/__init__.py +0 -0
  436. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_shutdown/test_kill_monitoring.py +0 -0
  437. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_staging/__init__.py +0 -0
  438. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_staging/staging_provider.py +0 -0
  439. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_staging/test_1316.py +0 -0
  440. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_staging/test_docs_1.py +0 -0
  441. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_staging/test_docs_2.py +0 -0
  442. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
  443. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_staging/test_file.py +0 -0
  444. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_staging/test_file_apps.py +0 -0
  445. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_staging/test_file_staging.py +0 -0
  446. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_staging/test_output_chain_filenames.py +0 -0
  447. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
  448. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
  449. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_staging/test_staging_globus.py +0 -0
  450. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_staging/test_staging_https.py +0 -0
  451. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_staging/test_staging_stdout.py +0 -0
  452. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_staging/test_zip_in.py +0 -0
  453. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_staging/test_zip_out.py +0 -0
  454. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_staging/test_zip_to_zip.py +0 -0
  455. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_summary.py +0 -0
  456. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_thread_parallelism.py +0 -0
  457. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_threads/__init__.py +0 -0
  458. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_threads/test_configs.py +0 -0
  459. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
  460. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_utils/__init__.py +0 -0
  461. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/test_utils/test_representation_mixin.py +0 -0
  462. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/unit/__init__.py +0 -0
  463. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/unit/test_file.py +0 -0
  464. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/tests/utils.py +0 -0
  465. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/usage_tracking/__init__.py +0 -0
  466. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/usage_tracking/api.py +0 -0
  467. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/usage_tracking/usage.py +0 -0
  468. {parsl-2024.5.13 → parsl-2024.5.20}/parsl/utils.py +0 -0
  469. {parsl-2024.5.13 → parsl-2024.5.20}/parsl.egg-info/dependency_links.txt +0 -0
  470. {parsl-2024.5.13 → parsl-2024.5.20}/parsl.egg-info/entry_points.txt +0 -0
  471. {parsl-2024.5.13 → parsl-2024.5.20}/parsl.egg-info/top_level.txt +0 -0
  472. {parsl-2024.5.13 → parsl-2024.5.20}/requirements.txt +0 -0
  473. {parsl-2024.5.13 → parsl-2024.5.20}/setup.cfg +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: parsl
3
- Version: 2024.5.13
3
+ Version: 2024.5.20
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/2024.05.13.tar.gz
6
+ Download-URL: https://github.com/Parsl/parsl/archive/2024.05.20.tar.gz
7
7
  Author: The Parsl Team
8
8
  Author-email: parsl@googlegroups.com
9
9
  License: Apache 2.0
@@ -22,17 +22,19 @@ Parsl lets you chain functions together and will launch each function as inputs
22
22
  return x + 1
23
23
 
24
24
  @python_app
25
- def g(x):
26
- return x * 2
25
+ def g(x, y):
26
+ return x + y
27
27
 
28
28
  # Start Parsl on a single computer
29
29
  with parsl.load():
30
- # These functions now return Futures, and can be chained
30
+ # These functions now return Futures
31
31
  future = f(1)
32
32
  assert future.result() == 2
33
33
 
34
- future = g(f(1))
35
- assert future.result() == 4
34
+ # Functions run concurrently, can be chained
35
+ f_a, f_b = f(2), f(3)
36
+ future = g(f_a, f_b)
37
+ assert future.result() == 7
36
38
 
37
39
 
38
40
  Start with the `configuration quickstart <https://parsl.readthedocs.io/en/stable/quickstart.html#getting-started>`_ to learn how to tell Parsl how to use your computing resource,
@@ -89,15 +89,8 @@ class Channel(metaclass=ABCMeta):
89
89
  pass
90
90
 
91
91
  @abstractmethod
92
- def close(self) -> bool:
93
- ''' Closes the channel. Clean out any auth credentials.
94
-
95
- Args:
96
- None
97
-
98
- Returns:
99
- Bool
100
-
92
+ def close(self) -> None:
93
+ ''' Closes the channel.
101
94
  '''
102
95
  pass
103
96
 
@@ -107,13 +107,10 @@ class LocalChannel(Channel, RepresentationMixin):
107
107
  def pull_file(self, remote_source, local_dir):
108
108
  return self.push_file(remote_source, local_dir)
109
109
 
110
- def close(self):
111
- ''' There's nothing to close here, and this really doesn't do anything
112
-
113
- Returns:
114
- - False, because it really did not "close" this channel.
110
+ def close(self) -> None:
111
+ ''' There's nothing to close here, and so this doesn't do anything
115
112
  '''
116
- return False
113
+ pass
117
114
 
118
115
  def isdir(self, path):
119
116
  """Return true if the path refers to an existing directory.
@@ -106,5 +106,5 @@ class OAuthSSHChannel(SSHChannel):
106
106
 
107
107
  return exit_status, stdout, stderr
108
108
 
109
- def close(self):
110
- return self.transport.close()
109
+ def close(self) -> None:
110
+ self.transport.close()
@@ -217,9 +217,9 @@ class SSHChannel(Channel, RepresentationMixin):
217
217
 
218
218
  return local_dest
219
219
 
220
- def close(self):
220
+ def close(self) -> None:
221
221
  if self._is_connected():
222
- return self.ssh_client.close()
222
+ self.ssh_client.close()
223
223
 
224
224
  def isdir(self, path):
225
225
  """Return true if the path refers to an existing directory.
@@ -1156,7 +1156,7 @@ class DataFlowKernel:
1156
1156
  executor.run_id = self.run_id
1157
1157
  executor.run_dir = self.run_dir
1158
1158
  executor.hub_address = self.hub_address
1159
- executor.hub_port = self.hub_zmq_port
1159
+ executor.hub_zmq_port = self.hub_zmq_port
1160
1160
  if self.monitoring:
1161
1161
  executor.monitoring_radio = self.monitoring.radio
1162
1162
  if hasattr(executor, 'provider'):
@@ -1,9 +1,11 @@
1
1
  from parsl.executors.threads import ThreadPoolExecutor
2
2
  from parsl.executors.workqueue.executor import WorkQueueExecutor
3
3
  from parsl.executors.high_throughput.executor import HighThroughputExecutor
4
+ from parsl.executors.high_throughput.mpi_executor import MPIExecutor
4
5
  from parsl.executors.flux.executor import FluxExecutor
5
6
 
6
7
  __all__ = ['ThreadPoolExecutor',
7
8
  'HighThroughputExecutor',
9
+ 'MPIExecutor',
8
10
  'WorkQueueExecutor',
9
11
  'FluxExecutor']
@@ -50,13 +50,13 @@ class ParslExecutor(metaclass=ABCMeta):
50
50
  self,
51
51
  *,
52
52
  hub_address: Optional[str] = None,
53
- hub_port: Optional[int] = None,
53
+ hub_zmq_port: Optional[int] = None,
54
54
  monitoring_radio: Optional[MonitoringRadio] = None,
55
55
  run_dir: str = ".",
56
56
  run_id: Optional[str] = None,
57
57
  ):
58
58
  self.hub_address = hub_address
59
- self.hub_port = hub_port
59
+ self.hub_zmq_port = hub_zmq_port
60
60
  self.monitoring_radio = monitoring_radio
61
61
  self.run_dir = os.path.abspath(run_dir)
62
62
  self.run_id = run_id
@@ -136,14 +136,14 @@ class ParslExecutor(metaclass=ABCMeta):
136
136
  self._hub_address = value
137
137
 
138
138
  @property
139
- def hub_port(self) -> Optional[int]:
139
+ def hub_zmq_port(self) -> Optional[int]:
140
140
  """Port to the Hub for monitoring.
141
141
  """
142
- return self._hub_port
142
+ return self._hub_zmq_port
143
143
 
144
- @hub_port.setter
145
- def hub_port(self, value: Optional[int]) -> None:
146
- self._hub_port = value
144
+ @hub_zmq_port.setter
145
+ def hub_zmq_port(self, value: Optional[int]) -> None:
146
+ self._hub_zmq_port = value
147
147
 
148
148
  @property
149
149
  def monitoring_radio(self) -> Optional[MonitoringRadio]:
@@ -62,47 +62,7 @@ DEFAULT_LAUNCH_CMD = ("process_worker_pool.py {debug} {max_workers_per_node} "
62
62
  "--mpi-launcher={mpi_launcher} "
63
63
  "--available-accelerators {accelerators}")
64
64
 
65
-
66
- class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageInformation):
67
- """Executor designed for cluster-scale
68
-
69
- The HighThroughputExecutor system has the following components:
70
- 1. The HighThroughputExecutor instance which is run as part of the Parsl script.
71
- 2. The Interchange which acts as a load-balancing proxy between workers and Parsl
72
- 3. The multiprocessing based worker pool which coordinates task execution over several
73
- cores on a node.
74
- 4. ZeroMQ pipes connect the HighThroughputExecutor, Interchange and the process_worker_pool
75
-
76
- Here is a diagram
77
-
78
- .. code:: python
79
-
80
-
81
- | Data | Executor | Interchange | External Process(es)
82
- | Flow | | |
83
- Task | Kernel | | |
84
- +----->|-------->|------------>|->outgoing_q---|-> process_worker_pool
85
- | | | | batching | | |
86
- Parsl<---Fut-| | | load-balancing| result exception
87
- ^ | | | watchdogs | | |
88
- | | | Q_mngmnt | | V V
89
- | | | Thread<--|-incoming_q<---|--- +---------+
90
- | | | | | |
91
- | | | | | |
92
- +----update_fut-----+
93
-
94
-
95
- Each of the workers in each process_worker_pool has access to its local rank through
96
- an environmental variable, ``PARSL_WORKER_RANK``. The local rank is unique for each process
97
- and is an integer in the range from 0 to the number of workers per in the pool minus 1.
98
- The workers also have access to the ID of the worker pool as ``PARSL_WORKER_POOL_ID``
99
- and the size of the worker pool as ``PARSL_WORKER_COUNT``.
100
-
101
-
102
- Parameters
103
- ----------
104
-
105
- provider : :class:`~parsl.providers.base.ExecutionProvider`
65
+ GENERAL_HTEX_PARAM_DOCS = """provider : :class:`~parsl.providers.base.ExecutionProvider`
106
66
  Provider to access computation resources. Can be one of :class:`~parsl.providers.aws.aws.EC2Provider`,
107
67
  :class:`~parsl.providers.cobalt.cobalt.Cobalt`,
108
68
  :class:`~parsl.providers.condor.condor.Condor`,
@@ -148,39 +108,6 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
148
108
  worker_debug : Bool
149
109
  Enables worker debug logging.
150
110
 
151
- cores_per_worker : float
152
- cores to be assigned to each worker. Oversubscription is possible
153
- by setting cores_per_worker < 1.0. Default=1
154
-
155
- mem_per_worker : float
156
- GB of memory required per worker. If this option is specified, the node manager
157
- will check the available memory at startup and limit the number of workers such that
158
- the there's sufficient memory for each worker. Default: None
159
-
160
- max_workers : int
161
- Deprecated. Please use max_workers_per_node instead.
162
-
163
- max_workers_per_node : int
164
- Caps the number of workers launched per node. Default: None
165
-
166
- cpu_affinity: string
167
- Whether or how each worker process sets thread affinity. Options include "none" to forgo
168
- any CPU affinity configuration, "block" to assign adjacent cores to workers
169
- (ex: assign 0-1 to worker 0, 2-3 to worker 1), and
170
- "alternating" to assign cores to workers in round-robin
171
- (ex: assign 0,2 to worker 0, 1,3 to worker 1).
172
- The "block-reverse" option assigns adjacent cores to workers, but assigns
173
- the CPUs with large indices to low index workers (ex: assign 2-3 to worker 1, 0,1 to worker 2)
174
-
175
- available_accelerators: int | list
176
- Accelerators available for workers to use. Each worker will be pinned to exactly one of the provided
177
- accelerators, and no more workers will be launched than the number of accelerators.
178
-
179
- Either provide the list of accelerator names or the number available. If a number is provided,
180
- Parsl will create names as integers starting with 0.
181
-
182
- default: empty list
183
-
184
111
  prefetch_capacity : int
185
112
  Number of tasks that could be prefetched over available worker capacity.
186
113
  When there are a few tasks (<100) or when tasks are long running, this option should
@@ -214,6 +141,85 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
214
141
  worker_logdir_root : string
215
142
  In case of a remote file system, specify the path to where logs will be kept.
216
143
 
144
+ encrypted : bool
145
+ Flag to enable/disable encryption (CurveZMQ). Default is False.
146
+ """ # Documentation for params used by both HTEx and MPIEx
147
+
148
+
149
+ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageInformation):
150
+ __doc__ = f"""Executor designed for cluster-scale
151
+
152
+ The HighThroughputExecutor system has the following components:
153
+ 1. The HighThroughputExecutor instance which is run as part of the Parsl script.
154
+ 2. The Interchange which acts as a load-balancing proxy between workers and Parsl
155
+ 3. The multiprocessing based worker pool which coordinates task execution over several
156
+ cores on a node.
157
+ 4. ZeroMQ pipes connect the HighThroughputExecutor, Interchange and the process_worker_pool
158
+
159
+ Here is a diagram
160
+
161
+ .. code:: python
162
+
163
+
164
+ | Data | Executor | Interchange | External Process(es)
165
+ | Flow | | |
166
+ Task | Kernel | | |
167
+ +----->|-------->|------------>|->outgoing_q---|-> process_worker_pool
168
+ | | | | batching | | |
169
+ Parsl<---Fut-| | | load-balancing| result exception
170
+ ^ | | | watchdogs | | |
171
+ | | | Q_mngmnt | | V V
172
+ | | | Thread<--|-incoming_q<---|--- +---------+
173
+ | | | | | |
174
+ | | | | | |
175
+ +----update_fut-----+
176
+
177
+
178
+ Each of the workers in each process_worker_pool has access to its local rank through
179
+ an environmental variable, ``PARSL_WORKER_RANK``. The local rank is unique for each process
180
+ and is an integer in the range from 0 to the number of workers per in the pool minus 1.
181
+ The workers also have access to the ID of the worker pool as ``PARSL_WORKER_POOL_ID``
182
+ and the size of the worker pool as ``PARSL_WORKER_COUNT``.
183
+
184
+
185
+ Parameters
186
+ ----------
187
+
188
+ {GENERAL_HTEX_PARAM_DOCS}
189
+
190
+ cores_per_worker : float
191
+ cores to be assigned to each worker. Oversubscription is possible
192
+ by setting cores_per_worker < 1.0. Default=1
193
+
194
+ mem_per_worker : float
195
+ GB of memory required per worker. If this option is specified, the node manager
196
+ will check the available memory at startup and limit the number of workers such that
197
+ the there's sufficient memory for each worker. Default: None
198
+
199
+ max_workers : int
200
+ Deprecated. Please use max_workers_per_node instead.
201
+
202
+ max_workers_per_node : int
203
+ Caps the number of workers launched per node. Default: None
204
+
205
+ cpu_affinity: string
206
+ Whether or how each worker process sets thread affinity. Options include "none" to forgo
207
+ any CPU affinity configuration, "block" to assign adjacent cores to workers
208
+ (ex: assign 0-1 to worker 0, 2-3 to worker 1), and
209
+ "alternating" to assign cores to workers in round-robin
210
+ (ex: assign 0,2 to worker 0, 1,3 to worker 1).
211
+ The "block-reverse" option assigns adjacent cores to workers, but assigns
212
+ the CPUs with large indices to low index workers (ex: assign 2-3 to worker 1, 0,1 to worker 2)
213
+
214
+ available_accelerators: int | list
215
+ Accelerators available for workers to use. Each worker will be pinned to exactly one of the provided
216
+ accelerators, and no more workers will be launched than the number of accelerators.
217
+
218
+ Either provide the list of accelerator names or the number available. If a number is provided,
219
+ Parsl will create names as integers starting with 0.
220
+
221
+ default: empty list
222
+
217
223
  enable_mpi_mode: bool
218
224
  If enabled, MPI launch prefixes will be composed for the batch scheduler based on
219
225
  the nodes available in each batch job and the resource_specification dict passed
@@ -224,9 +230,6 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
224
230
  This field is only used if enable_mpi_mode is set. Select one from the
225
231
  list of supported MPI launchers = ("srun", "aprun", "mpiexec").
226
232
  default: "mpiexec"
227
-
228
- encrypted : bool
229
- Flag to enable/disable encryption (CurveZMQ). Default is False.
230
233
  """
231
234
 
232
235
  @typeguard.typechecked
@@ -305,9 +308,6 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
305
308
  self._workers_per_node = 1 # our best guess-- we do not have any provider hints
306
309
 
307
310
  self._task_counter = 0
308
- self.run_id = None # set to the correct run_id in dfk
309
- self.hub_address = None # set to the correct hub address in dfk
310
- self.hub_port = None # set to the correct hub port in dfk
311
311
  self.worker_ports = worker_ports
312
312
  self.worker_port_range = worker_port_range
313
313
  self.interchange_proc: Optional[Process] = None
@@ -326,8 +326,8 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
326
326
  assert mpi_launcher in VALID_LAUNCHERS, \
327
327
  f"mpi_launcher must be set to one of {VALID_LAUNCHERS}"
328
328
  if self.enable_mpi_mode:
329
- assert isinstance(self.provider.launcher, parsl.launchers.SingleNodeLauncher), \
330
- "mpi_mode requires the provider to be configured to use a SingleNodeLauncher"
329
+ assert isinstance(self.provider.launcher, parsl.launchers.SimpleLauncher), \
330
+ "mpi_mode requires the provider to be configured to use a SimpleLauncher"
331
331
 
332
332
  self.mpi_launcher = mpi_launcher
333
333
 
@@ -541,7 +541,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
541
541
  "worker_ports": self.worker_ports,
542
542
  "worker_port_range": self.worker_port_range,
543
543
  "hub_address": self.hub_address,
544
- "hub_port": self.hub_port,
544
+ "hub_zmq_port": self.hub_zmq_port,
545
545
  "logdir": self.logdir,
546
546
  "heartbeat_threshold": self.heartbeat_threshold,
547
547
  "poll_period": self.poll_period,
@@ -74,7 +74,7 @@ class Interchange:
74
74
  worker_ports: Optional[Tuple[int, int]] = None,
75
75
  worker_port_range: Tuple[int, int] = (54000, 55000),
76
76
  hub_address: Optional[str] = None,
77
- hub_port: Optional[int] = None,
77
+ hub_zmq_port: Optional[int] = None,
78
78
  heartbeat_threshold: int = 60,
79
79
  logdir: str = ".",
80
80
  logging_level: int = logging.INFO,
@@ -105,7 +105,7 @@ class Interchange:
105
105
  The IP address at which the interchange can send info about managers to when monitoring is enabled.
106
106
  Default: None (meaning monitoring disabled)
107
107
 
108
- hub_port : str
108
+ hub_zmq_port : str
109
109
  The port at which the interchange can send info about managers to when monitoring is enabled.
110
110
  Default: None (meaning monitoring disabled)
111
111
 
@@ -151,7 +151,7 @@ class Interchange:
151
151
  logger.info("Connected to client")
152
152
 
153
153
  self.hub_address = hub_address
154
- self.hub_port = hub_port
154
+ self.hub_zmq_port = hub_zmq_port
155
155
 
156
156
  self.pending_task_queue: queue.Queue[Any] = queue.Queue(maxsize=10 ** 6)
157
157
  self.count = 0
@@ -244,12 +244,12 @@ class Interchange:
244
244
  logger.debug(f"Fetched {task_counter} tasks so far")
245
245
 
246
246
  def _create_monitoring_channel(self) -> Optional[zmq.Socket]:
247
- if self.hub_address and self.hub_port:
247
+ if self.hub_address and self.hub_zmq_port:
248
248
  logger.info("Connecting to MonitoringHub")
249
249
  # This is a one-off because monitoring is unencrypted
250
250
  hub_channel = zmq.Context().socket(zmq.DEALER)
251
251
  hub_channel.set_hwm(0)
252
- hub_channel.connect("tcp://{}:{}".format(self.hub_address, self.hub_port))
252
+ hub_channel.connect("tcp://{}:{}".format(self.hub_address, self.hub_zmq_port))
253
253
  logger.info("Connected to MonitoringHub")
254
254
  return hub_channel
255
255
  else:
@@ -329,6 +329,7 @@ class Interchange:
329
329
  reply = None
330
330
 
331
331
  else:
332
+ logger.error(f"Received unknown command: {command_req}")
332
333
  reply = None
333
334
 
334
335
  logger.debug("Reply: {}".format(reply))
@@ -0,0 +1,85 @@
1
+ """A simplified interface for HTEx when running in MPI mode"""
2
+ from typing import Optional, Tuple, List, Union, Callable, Dict
3
+
4
+ import typeguard
5
+
6
+ from parsl.data_provider.staging import Staging
7
+ from parsl.executors.high_throughput.executor import HighThroughputExecutor, GENERAL_HTEX_PARAM_DOCS
8
+ from parsl.executors.status_handling import BlockProviderExecutor
9
+ from parsl.jobs.states import JobStatus
10
+ from parsl.providers import LocalProvider
11
+ from parsl.providers.base import ExecutionProvider
12
+
13
+
14
+ class MPIExecutor(HighThroughputExecutor):
15
+ __doc__ = f"""A version of :class:`~parsl.HighThroughputExecutor` tuned for executing multi-node (e.g., MPI) tasks.
16
+
17
+ The Provider _must_ use the :class:`~parsl.launchers.SimpleLauncher`,
18
+ which places a single pool of workers on the first node of a block.
19
+ Each worker can then make system calls which use an MPI launcher (e.g., ``mpirun``, ``srun``)
20
+ to spawn multi-node tasks.
21
+
22
+ Specify the maximum number of multi-node tasks to run at once using ``max_workers_per_block``.
23
+ The maximum number should be smaller than the ``nodes_per_block`` in the Provider.
24
+
25
+ Parameters
26
+ ----------
27
+ max_workers_per_block: int
28
+ Maximum number of MPI applications to run at once per block
29
+
30
+ {GENERAL_HTEX_PARAM_DOCS}
31
+ """
32
+
33
+ @typeguard.typechecked
34
+ def __init__(self,
35
+ label: str = 'MPIExecutor',
36
+ provider: ExecutionProvider = LocalProvider(),
37
+ launch_cmd: Optional[str] = None,
38
+ address: Optional[str] = None,
39
+ worker_ports: Optional[Tuple[int, int]] = None,
40
+ worker_port_range: Optional[Tuple[int, int]] = (54000, 55000),
41
+ interchange_port_range: Optional[Tuple[int, int]] = (55000, 56000),
42
+ storage_access: Optional[List[Staging]] = None,
43
+ working_dir: Optional[str] = None,
44
+ worker_debug: bool = False,
45
+ max_workers_per_block: int = 1,
46
+ prefetch_capacity: int = 0,
47
+ heartbeat_threshold: int = 120,
48
+ heartbeat_period: int = 30,
49
+ drain_period: Optional[int] = None,
50
+ poll_period: int = 10,
51
+ address_probe_timeout: Optional[int] = None,
52
+ worker_logdir_root: Optional[str] = None,
53
+ mpi_launcher: str = "mpiexec",
54
+ block_error_handler: Union[bool, Callable[[BlockProviderExecutor, Dict[str, JobStatus]], None]] = True,
55
+ encrypted: bool = False):
56
+ super().__init__(
57
+ # Hard-coded settings
58
+ cores_per_worker=1e-9, # Ensures there will be at least an absurd number of workers
59
+ enable_mpi_mode=True,
60
+ max_workers_per_node=max_workers_per_block,
61
+
62
+ # Everything else
63
+ label=label,
64
+ provider=provider,
65
+ launch_cmd=launch_cmd,
66
+ address=address,
67
+ worker_ports=worker_ports,
68
+ worker_port_range=worker_port_range,
69
+ interchange_port_range=interchange_port_range,
70
+ storage_access=storage_access,
71
+ working_dir=working_dir,
72
+ worker_debug=worker_debug,
73
+ prefetch_capacity=prefetch_capacity,
74
+ heartbeat_threshold=heartbeat_threshold,
75
+ heartbeat_period=heartbeat_period,
76
+ drain_period=drain_period,
77
+ poll_period=poll_period,
78
+ address_probe_timeout=address_probe_timeout,
79
+ worker_logdir_root=worker_logdir_root,
80
+ mpi_launcher=mpi_launcher,
81
+ block_error_handler=block_error_handler,
82
+ encrypted=encrypted
83
+ )
84
+
85
+ self.max_workers_per_block = max_workers_per_block
@@ -208,8 +208,11 @@ class MPITaskScheduler(TaskScheduler):
208
208
  """Return result and relinquish provisioned nodes"""
209
209
  result_pkl = self.pending_result_q.get(block, timeout=timeout)
210
210
  result_dict = pickle.loads(result_pkl)
211
+ # TODO (wardlt): If the task did not request nodes, it won't be in `self._map_tasks_to_nodes`.
212
+ # Causes Parsl to hang. See Issue #3427
211
213
  if result_dict["type"] == "result":
212
214
  task_id = result_dict["task_id"]
215
+ assert task_id in self._map_tasks_to_nodes, "You are about to experience issue #3427"
213
216
  nodes_to_reallocate = self._map_tasks_to_nodes[task_id]
214
217
  self._return_nodes(nodes_to_reallocate)
215
218
  self._schedule_backlog_tasks()
@@ -96,6 +96,22 @@ def monitor_wrapper(*,
96
96
  return (wrapped, args, new_kwargs)
97
97
 
98
98
 
99
+ def get_radio(radio_mode: str, monitoring_hub_url: str, task_id: int, run_dir: str) -> MonitoringRadio:
100
+ radio: MonitoringRadio
101
+ if radio_mode == "udp":
102
+ radio = UDPRadio(monitoring_hub_url,
103
+ source_id=task_id)
104
+ elif radio_mode == "htex":
105
+ radio = HTEXRadio(monitoring_hub_url,
106
+ source_id=task_id)
107
+ elif radio_mode == "filesystem":
108
+ radio = FilesystemRadio(monitoring_url=monitoring_hub_url,
109
+ source_id=task_id, run_dir=run_dir)
110
+ else:
111
+ raise RuntimeError(f"Unknown radio mode: {radio_mode}")
112
+ return radio
113
+
114
+
99
115
  @wrap_with_logs
100
116
  def send_first_message(try_id: int,
101
117
  task_id: int,
@@ -122,18 +138,7 @@ def send_first_last_message(try_id: int,
122
138
  import platform
123
139
  import os
124
140
 
125
- radio: MonitoringRadio
126
- if radio_mode == "udp":
127
- radio = UDPRadio(monitoring_hub_url,
128
- source_id=task_id)
129
- elif radio_mode == "htex":
130
- radio = HTEXRadio(monitoring_hub_url,
131
- source_id=task_id)
132
- elif radio_mode == "filesystem":
133
- radio = FilesystemRadio(monitoring_url=monitoring_hub_url,
134
- source_id=task_id, run_dir=run_dir)
135
- else:
136
- raise RuntimeError(f"Unknown radio mode: {radio_mode}")
141
+ radio = get_radio(radio_mode, monitoring_hub_url, task_id, run_dir)
137
142
 
138
143
  msg = (MessageType.RESOURCE_INFO,
139
144
  {'run_id': run_id,
@@ -178,18 +183,7 @@ def monitor(pid: int,
178
183
 
179
184
  setproctitle("parsl: task resource monitor")
180
185
 
181
- radio: MonitoringRadio
182
- if radio_mode == "udp":
183
- radio = UDPRadio(monitoring_hub_url,
184
- source_id=task_id)
185
- elif radio_mode == "htex":
186
- radio = HTEXRadio(monitoring_hub_url,
187
- source_id=task_id)
188
- elif radio_mode == "filesystem":
189
- radio = FilesystemRadio(monitoring_url=monitoring_hub_url,
190
- source_id=task_id, run_dir=run_dir)
191
- else:
192
- raise RuntimeError(f"Unknown radio mode: {radio_mode}")
186
+ radio = get_radio(radio_mode, monitoring_hub_url, task_id, run_dir)
193
187
 
194
188
  logging.debug("start of monitor")
195
189
 
@@ -206,7 +206,7 @@ class LocalProvider(ExecutionProvider, RepresentationMixin):
206
206
  script_path = "{0}/{1}.sh".format(self.script_dir, job_name)
207
207
  script_path = os.path.abspath(script_path)
208
208
 
209
- wrap_command = self.worker_init + f'\nexport JOBNAME=${job_name}\n' + self.launcher(command, tasks_per_node, self.nodes_per_block)
209
+ wrap_command = self.worker_init + f'\nexport JOBNAME={job_name}\n' + self.launcher(command, tasks_per_node, self.nodes_per_block)
210
210
 
211
211
  self._write_submit_script(wrap_command, script_path)
212
212
 
@@ -0,0 +1,33 @@
1
+ import pytest
2
+
3
+ from parsl import Config
4
+ from parsl.executors import HighThroughputExecutor
5
+ from parsl.launchers import SrunLauncher, AprunLauncher, SimpleLauncher
6
+ from parsl.providers import SlurmProvider
7
+
8
+
9
+ @pytest.mark.local
10
+ def test_bad_launcher_with_mpi_mode():
11
+ """AssertionError if a launcher other than SimpleLauncher is supplied"""
12
+
13
+ for launcher in [SrunLauncher(), AprunLauncher()]:
14
+ with pytest.raises(AssertionError):
15
+ Config(executors=[
16
+ HighThroughputExecutor(
17
+ enable_mpi_mode=True,
18
+ provider=SlurmProvider(launcher=launcher),
19
+ )
20
+ ])
21
+
22
+
23
+ @pytest.mark.local
24
+ def test_correct_launcher_with_mpi_mode():
25
+ """Confirm that SimpleLauncher works with mpi_mode"""
26
+
27
+ config = Config(executors=[
28
+ HighThroughputExecutor(
29
+ enable_mpi_mode=True,
30
+ provider=SlurmProvider(launcher=SimpleLauncher()),
31
+ )
32
+ ])
33
+ assert isinstance(config.executors[0].provider.launcher, SimpleLauncher)
@@ -1,4 +1,3 @@
1
- import logging
2
1
  from typing import Dict
3
2
  import pytest
4
3
  import parsl