parsl 2024.7.1__tar.gz → 2024.7.8__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 (482) hide show
  1. {parsl-2024.7.1/parsl.egg-info → parsl-2024.7.8}/PKG-INFO +2 -2
  2. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/app/app.py +4 -0
  3. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/channels/ssh/ssh.py +12 -0
  4. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/high_throughput/executor.py +12 -1
  5. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/high_throughput/mpi_executor.py +2 -0
  6. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/radical/executor.py +105 -65
  7. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/radical/rpex_resources.py +14 -7
  8. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/kubernetes/kube.py +2 -3
  9. parsl-2024.7.8/parsl/tests/test_bash_apps/test_inputs_default.py +25 -0
  10. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_htex/test_htex.py +13 -0
  11. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_providers/test_local_provider.py +12 -7
  12. parsl-2024.7.8/parsl/tests/test_python_apps/test_inputs_default.py +22 -0
  13. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/version.py +1 -1
  14. {parsl-2024.7.1 → parsl-2024.7.8/parsl.egg-info}/PKG-INFO +2 -2
  15. {parsl-2024.7.1 → parsl-2024.7.8}/parsl.egg-info/SOURCES.txt +2 -1
  16. parsl-2024.7.1/parsl/executors/radical/rpex_master.py +0 -41
  17. {parsl-2024.7.1 → parsl-2024.7.8}/LICENSE +0 -0
  18. {parsl-2024.7.1 → parsl-2024.7.8}/MANIFEST.in +0 -0
  19. {parsl-2024.7.1 → parsl-2024.7.8}/README.rst +0 -0
  20. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/__init__.py +0 -0
  21. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/addresses.py +0 -0
  22. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/app/__init__.py +0 -0
  23. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/app/bash.py +0 -0
  24. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/app/errors.py +0 -0
  25. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/app/futures.py +0 -0
  26. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/app/python.py +0 -0
  27. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/benchmark/__init__.py +0 -0
  28. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/benchmark/perf.py +0 -0
  29. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/channels/__init__.py +0 -0
  30. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/channels/base.py +0 -0
  31. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/channels/errors.py +0 -0
  32. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/channels/local/__init__.py +0 -0
  33. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/channels/local/local.py +0 -0
  34. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/channels/oauth_ssh/__init__.py +0 -0
  35. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/channels/oauth_ssh/oauth_ssh.py +0 -0
  36. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/channels/ssh/__init__.py +0 -0
  37. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/channels/ssh_il/__init__.py +0 -0
  38. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/channels/ssh_il/ssh_il.py +0 -0
  39. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/concurrent/__init__.py +0 -0
  40. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/config.py +0 -0
  41. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/configs/ASPIRE1.py +0 -0
  42. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/configs/Azure.py +0 -0
  43. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/configs/__init__.py +0 -0
  44. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/configs/ad_hoc.py +0 -0
  45. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/configs/bridges.py +0 -0
  46. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/configs/cc_in2p3.py +0 -0
  47. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/configs/ec2.py +0 -0
  48. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/configs/expanse.py +0 -0
  49. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/configs/frontera.py +0 -0
  50. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/configs/htex_local.py +0 -0
  51. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/configs/illinoiscluster.py +0 -0
  52. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/configs/kubernetes.py +0 -0
  53. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/configs/local_threads.py +0 -0
  54. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/configs/midway.py +0 -0
  55. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/configs/osg.py +0 -0
  56. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/configs/polaris.py +0 -0
  57. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/configs/stampede2.py +0 -0
  58. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/configs/summit.py +0 -0
  59. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/configs/toss3_llnl.py +0 -0
  60. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/configs/vineex_local.py +0 -0
  61. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/configs/wqex_local.py +0 -0
  62. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/curvezmq.py +0 -0
  63. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/data_provider/__init__.py +0 -0
  64. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/data_provider/data_manager.py +0 -0
  65. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/data_provider/file_noop.py +0 -0
  66. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/data_provider/files.py +0 -0
  67. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/data_provider/ftp.py +0 -0
  68. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/data_provider/globus.py +0 -0
  69. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/data_provider/http.py +0 -0
  70. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/data_provider/rsync.py +0 -0
  71. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/data_provider/staging.py +0 -0
  72. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/data_provider/zip.py +0 -0
  73. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/dataflow/__init__.py +0 -0
  74. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/dataflow/dependency_resolvers.py +0 -0
  75. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/dataflow/dflow.py +0 -0
  76. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/dataflow/errors.py +0 -0
  77. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/dataflow/futures.py +0 -0
  78. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/dataflow/memoization.py +0 -0
  79. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/dataflow/rundirs.py +0 -0
  80. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/dataflow/states.py +0 -0
  81. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/dataflow/taskrecord.py +0 -0
  82. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/errors.py +0 -0
  83. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/__init__.py +0 -0
  84. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/base.py +0 -0
  85. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/errors.py +0 -0
  86. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/flux/__init__.py +0 -0
  87. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/flux/execute_parsl_task.py +0 -0
  88. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/flux/executor.py +0 -0
  89. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/flux/flux_instance_manager.py +0 -0
  90. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/high_throughput/__init__.py +0 -0
  91. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/high_throughput/errors.py +0 -0
  92. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/high_throughput/interchange.py +0 -0
  93. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/high_throughput/manager_record.py +0 -0
  94. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/high_throughput/monitoring_info.py +0 -0
  95. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/high_throughput/mpi_prefix_composer.py +0 -0
  96. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/high_throughput/mpi_resource_management.py +0 -0
  97. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/high_throughput/probe.py +0 -0
  98. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/high_throughput/process_worker_pool.py +0 -0
  99. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/high_throughput/zmq_pipes.py +0 -0
  100. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/radical/__init__.py +0 -0
  101. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/radical/rpex_worker.py +0 -0
  102. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/status_handling.py +0 -0
  103. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/taskvine/__init__.py +0 -0
  104. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/taskvine/errors.py +0 -0
  105. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/taskvine/exec_parsl_function.py +0 -0
  106. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/taskvine/executor.py +0 -0
  107. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/taskvine/factory.py +0 -0
  108. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/taskvine/factory_config.py +0 -0
  109. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/taskvine/manager.py +0 -0
  110. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/taskvine/manager_config.py +0 -0
  111. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/taskvine/utils.py +0 -0
  112. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/threads.py +0 -0
  113. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/workqueue/__init__.py +0 -0
  114. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/workqueue/errors.py +0 -0
  115. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/workqueue/exec_parsl_function.py +0 -0
  116. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/workqueue/executor.py +0 -0
  117. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/workqueue/parsl_coprocess.py +0 -0
  118. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
  119. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/jobs/__init__.py +0 -0
  120. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/jobs/error_handlers.py +0 -0
  121. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/jobs/errors.py +0 -0
  122. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/jobs/job_status_poller.py +0 -0
  123. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/jobs/states.py +0 -0
  124. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/jobs/strategy.py +0 -0
  125. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/launchers/__init__.py +0 -0
  126. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/launchers/base.py +0 -0
  127. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/launchers/errors.py +0 -0
  128. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/launchers/launchers.py +0 -0
  129. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/log_utils.py +0 -0
  130. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/monitoring/__init__.py +0 -0
  131. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/monitoring/db_manager.py +0 -0
  132. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/monitoring/message_type.py +0 -0
  133. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/monitoring/monitoring.py +0 -0
  134. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/monitoring/queries/__init__.py +0 -0
  135. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/monitoring/queries/pandas.py +0 -0
  136. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/monitoring/radios.py +0 -0
  137. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/monitoring/remote.py +0 -0
  138. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/monitoring/router.py +0 -0
  139. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/monitoring/types.py +0 -0
  140. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/monitoring/visualization/__init__.py +0 -0
  141. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/monitoring/visualization/app.py +0 -0
  142. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/monitoring/visualization/models.py +0 -0
  143. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/monitoring/visualization/plots/__init__.py +0 -0
  144. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
  145. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
  146. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/monitoring/visualization/plots/default/workflow_plots.py +0 -0
  147. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +0 -0
  148. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
  149. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
  150. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/monitoring/visualization/templates/app.html +0 -0
  151. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/monitoring/visualization/templates/dag.html +0 -0
  152. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/monitoring/visualization/templates/error.html +0 -0
  153. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/monitoring/visualization/templates/layout.html +0 -0
  154. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
  155. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/monitoring/visualization/templates/task.html +0 -0
  156. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/monitoring/visualization/templates/workflow.html +0 -0
  157. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
  158. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/monitoring/visualization/utils.py +0 -0
  159. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/monitoring/visualization/version.py +0 -0
  160. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/monitoring/visualization/views.py +0 -0
  161. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/multiprocessing.py +0 -0
  162. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/process_loggers.py +0 -0
  163. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/__init__.py +0 -0
  164. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/ad_hoc/__init__.py +0 -0
  165. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/ad_hoc/ad_hoc.py +0 -0
  166. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/aws/__init__.py +0 -0
  167. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/aws/aws.py +0 -0
  168. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/aws/template.py +0 -0
  169. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/azure/__init__.py +0 -0
  170. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/azure/azure.py +0 -0
  171. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/azure/template.py +0 -0
  172. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/base.py +0 -0
  173. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/cluster_provider.py +0 -0
  174. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/cobalt/__init__.py +0 -0
  175. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/cobalt/cobalt.py +0 -0
  176. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/cobalt/template.py +0 -0
  177. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/condor/__init__.py +0 -0
  178. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/condor/condor.py +0 -0
  179. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/condor/template.py +0 -0
  180. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/errors.py +0 -0
  181. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/googlecloud/__init__.py +0 -0
  182. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/googlecloud/googlecloud.py +0 -0
  183. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/grid_engine/__init__.py +0 -0
  184. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/grid_engine/grid_engine.py +0 -0
  185. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/grid_engine/template.py +0 -0
  186. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/kubernetes/__init__.py +0 -0
  187. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/kubernetes/template.py +0 -0
  188. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/local/__init__.py +0 -0
  189. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/local/local.py +0 -0
  190. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/lsf/__init__.py +0 -0
  191. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/lsf/lsf.py +0 -0
  192. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/lsf/template.py +0 -0
  193. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/pbspro/__init__.py +0 -0
  194. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/pbspro/pbspro.py +0 -0
  195. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/pbspro/template.py +0 -0
  196. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/slurm/__init__.py +0 -0
  197. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/slurm/slurm.py +0 -0
  198. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/slurm/template.py +0 -0
  199. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/torque/__init__.py +0 -0
  200. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/torque/template.py +0 -0
  201. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/providers/torque/torque.py +0 -0
  202. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/py.typed +0 -0
  203. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/serialize/__init__.py +0 -0
  204. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/serialize/base.py +0 -0
  205. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/serialize/concretes.py +0 -0
  206. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/serialize/errors.py +0 -0
  207. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/serialize/facade.py +0 -0
  208. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/serialize/proxystore.py +0 -0
  209. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/__init__.py +0 -0
  210. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/callables_helper.py +0 -0
  211. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/__init__.py +0 -0
  212. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/ad_hoc_cluster_htex.py +0 -0
  213. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/azure_single_node.py +0 -0
  214. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/bluewaters.py +0 -0
  215. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/bridges.py +0 -0
  216. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/cc_in2p3.py +0 -0
  217. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/comet.py +0 -0
  218. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/cooley_htex.py +0 -0
  219. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/ec2_single_node.py +0 -0
  220. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/ec2_spot.py +0 -0
  221. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/flux_local.py +0 -0
  222. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/frontera.py +0 -0
  223. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/htex_ad_hoc_cluster.py +0 -0
  224. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/htex_local.py +0 -0
  225. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/htex_local_alternate.py +0 -0
  226. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/htex_local_intask_staging.py +0 -0
  227. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/htex_local_rsync_staging.py +0 -0
  228. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/local_adhoc.py +0 -0
  229. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/local_radical.py +0 -0
  230. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/local_radical_mpi.py +0 -0
  231. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/local_threads.py +0 -0
  232. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
  233. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
  234. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/local_threads_checkpoint_periodic.py +0 -0
  235. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
  236. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
  237. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/local_threads_globus.py +0 -0
  238. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
  239. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/local_threads_monitoring.py +0 -0
  240. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/local_threads_no_cache.py +0 -0
  241. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/midway.py +0 -0
  242. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/nscc_singapore.py +0 -0
  243. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/osg_htex.py +0 -0
  244. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/petrelkube.py +0 -0
  245. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/summit.py +0 -0
  246. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/swan_htex.py +0 -0
  247. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/taskvine_ex.py +0 -0
  248. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/theta.py +0 -0
  249. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/user_opts.py +0 -0
  250. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/configs/workqueue_ex.py +0 -0
  251. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/conftest.py +0 -0
  252. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/integration/__init__.py +0 -0
  253. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/integration/latency.py +0 -0
  254. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/integration/test_apps/__init__.py +0 -0
  255. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/integration/test_channels/__init__.py +0 -0
  256. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/integration/test_channels/test_channels.py +0 -0
  257. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/integration/test_channels/test_local_channel.py +0 -0
  258. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/integration/test_channels/test_scp_1.py +0 -0
  259. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/integration/test_channels/test_ssh_1.py +0 -0
  260. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/integration/test_channels/test_ssh_errors.py +0 -0
  261. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/integration/test_channels/test_ssh_file_transport.py +0 -0
  262. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/integration/test_channels/test_ssh_interactive.py +0 -0
  263. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
  264. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/integration/test_stress/__init__.py +0 -0
  265. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
  266. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
  267. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/manual_tests/__init__.py +0 -0
  268. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/manual_tests/htex_local.py +0 -0
  269. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/manual_tests/test_ad_hoc_htex.py +0 -0
  270. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/manual_tests/test_basic.py +0 -0
  271. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/manual_tests/test_fan_in_out_htex_remote.py +0 -0
  272. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/manual_tests/test_log_filter.py +0 -0
  273. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/manual_tests/test_memory_limits.py +0 -0
  274. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/manual_tests/test_oauth_ssh.py +0 -0
  275. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/manual_tests/test_regression_220.py +0 -0
  276. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/manual_tests/test_udp_simple.py +0 -0
  277. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/manual_tests/test_worker_count.py +0 -0
  278. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/scaling_tests/__init__.py +0 -0
  279. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/scaling_tests/htex_local.py +0 -0
  280. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/scaling_tests/local_threads.py +0 -0
  281. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/scaling_tests/test_scale.py +0 -0
  282. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/scaling_tests/vineex_condor.py +0 -0
  283. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/scaling_tests/vineex_local.py +0 -0
  284. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/scaling_tests/wqex_condor.py +0 -0
  285. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/scaling_tests/wqex_local.py +0 -0
  286. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/site_tests/__init__.py +0 -0
  287. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/site_tests/site_config_selector.py +0 -0
  288. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/site_tests/test_provider.py +0 -0
  289. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/site_tests/test_site.py +0 -0
  290. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/sites/__init__.py +0 -0
  291. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/sites/test_affinity.py +0 -0
  292. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/sites/test_concurrent.py +0 -0
  293. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/sites/test_dynamic_executor.py +0 -0
  294. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/sites/test_ec2.py +0 -0
  295. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/sites/test_launchers.py +0 -0
  296. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/sites/test_local_adhoc.py +0 -0
  297. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/sites/test_mpi/__init__.py +0 -0
  298. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/sites/test_worker_info.py +0 -0
  299. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_aalst_patterns.py +0 -0
  300. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_bash_apps/__init__.py +0 -0
  301. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
  302. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_bash_apps/test_basic.py +0 -0
  303. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
  304. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
  305. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -0
  306. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_bash_apps/test_memoize.py +0 -0
  307. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
  308. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
  309. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_bash_apps/test_multiline.py +0 -0
  310. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_bash_apps/test_pipeline.py +0 -0
  311. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_bash_apps/test_std_uri.py +0 -0
  312. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_bash_apps/test_stdout.py +0 -0
  313. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_callables.py +0 -0
  314. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_channels/__init__.py +0 -0
  315. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_channels/test_large_output.py +0 -0
  316. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_checkpointing/__init__.py +0 -0
  317. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_checkpointing/test_periodic.py +0 -0
  318. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +0 -0
  319. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
  320. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_checkpointing/test_python_checkpoint_3.py +0 -0
  321. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
  322. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_checkpointing/test_regression_233.py +0 -0
  323. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
  324. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_checkpointing/test_task_exit.py +0 -0
  325. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_curvezmq.py +0 -0
  326. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_docs/__init__.py +0 -0
  327. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_docs/test_from_slides.py +0 -0
  328. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_docs/test_kwargs.py +0 -0
  329. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
  330. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_docs/test_workflow1.py +0 -0
  331. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_docs/test_workflow2.py +0 -0
  332. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_docs/test_workflow4.py +0 -0
  333. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_error_handling/__init__.py +0 -0
  334. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_error_handling/test_fail.py +0 -0
  335. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_error_handling/test_python_walltime.py +0 -0
  336. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_error_handling/test_rand_fail.py +0 -0
  337. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_error_handling/test_resource_spec.py +0 -0
  338. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_error_handling/test_retries.py +0 -0
  339. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
  340. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
  341. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
  342. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
  343. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_flowcontrol/__init__.py +0 -0
  344. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_flux.py +0 -0
  345. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_htex/__init__.py +0 -0
  346. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_htex/test_basic.py +0 -0
  347. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_htex/test_command_client_timeout.py +0 -0
  348. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_htex/test_connected_blocks.py +0 -0
  349. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_htex/test_cpu_affinity_explicit.py +0 -0
  350. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_htex/test_disconnected_blocks.py +0 -0
  351. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_htex/test_drain.py +0 -0
  352. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_htex/test_manager_failure.py +0 -0
  353. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_htex/test_managers_command.py +0 -0
  354. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_htex/test_missing_worker.py +0 -0
  355. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_htex/test_multiple_disconnected_blocks.py +0 -0
  356. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_htex/test_worker_failure.py +0 -0
  357. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_htex/test_zmq_binding.py +0 -0
  358. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_monitoring/__init__.py +0 -0
  359. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_monitoring/test_app_names.py +0 -0
  360. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_monitoring/test_basic.py +0 -0
  361. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
  362. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_monitoring/test_fuzz_zmq.py +0 -0
  363. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +0 -0
  364. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_monitoring/test_incomplete_futures.py +0 -0
  365. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_monitoring/test_memoization_representation.py +0 -0
  366. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_monitoring/test_stdouterr.py +0 -0
  367. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
  368. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_mpi_apps/__init__.py +0 -0
  369. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_mpi_apps/test_bad_mpi_config.py +0 -0
  370. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_mpi_apps/test_mpi_mode_disabled.py +0 -0
  371. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +0 -0
  372. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_mpi_apps/test_mpi_prefix.py +0 -0
  373. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_mpi_apps/test_mpi_scheduler.py +0 -0
  374. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_mpi_apps/test_mpiex.py +0 -0
  375. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_mpi_apps/test_resource_spec.py +0 -0
  376. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_providers/__init__.py +0 -0
  377. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_providers/test_cobalt_deprecation_warning.py +0 -0
  378. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_providers/test_pbspro_template.py +0 -0
  379. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_providers/test_slurm_instantiate.py +0 -0
  380. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_providers/test_slurm_template.py +0 -0
  381. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_providers/test_submiterror_deprecation.py +0 -0
  382. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_python_apps/__init__.py +0 -0
  383. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
  384. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_python_apps/test_basic.py +0 -0
  385. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_python_apps/test_context_manager.py +0 -0
  386. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_python_apps/test_dep_standard_futures.py +0 -0
  387. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
  388. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_python_apps/test_dependencies_deep.py +0 -0
  389. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_python_apps/test_depfail_propagation.py +0 -0
  390. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_python_apps/test_fail.py +0 -0
  391. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
  392. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
  393. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_python_apps/test_futures.py +0 -0
  394. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_python_apps/test_garbage_collect.py +0 -0
  395. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
  396. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_python_apps/test_join.py +0 -0
  397. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_python_apps/test_lifted.py +0 -0
  398. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_python_apps/test_mapred.py +0 -0
  399. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
  400. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_python_apps/test_memoize_2.py +0 -0
  401. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
  402. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +0 -0
  403. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
  404. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
  405. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_python_apps/test_outputs.py +0 -0
  406. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_python_apps/test_overview.py +0 -0
  407. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_python_apps/test_pipeline.py +0 -0
  408. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_python_apps/test_pluggable_future_resolution.py +0 -0
  409. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_python_apps/test_simple.py +0 -0
  410. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_python_apps/test_timeout.py +0 -0
  411. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_python_apps/test_type5.py +0 -0
  412. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_radical/__init__.py +0 -0
  413. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_radical/test_mpi_funcs.py +0 -0
  414. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_regression/__init__.py +0 -0
  415. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_regression/test_1480.py +0 -0
  416. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +0 -0
  417. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_regression/test_1653.py +0 -0
  418. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_regression/test_221.py +0 -0
  419. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_regression/test_226.py +0 -0
  420. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_regression/test_2652.py +0 -0
  421. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_regression/test_69a.py +0 -0
  422. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_regression/test_854.py +0 -0
  423. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_regression/test_97_parallelism_0.py +0 -0
  424. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_regression/test_98.py +0 -0
  425. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_scaling/__init__.py +0 -0
  426. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_scaling/test_block_error_handler.py +0 -0
  427. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_scaling/test_regression_1621.py +0 -0
  428. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_scaling/test_scale_down.py +0 -0
  429. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +0 -0
  430. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +0 -0
  431. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_scaling/test_shutdown_scalein.py +0 -0
  432. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_serialization/__init__.py +0 -0
  433. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_serialization/test_2555_caching_deserializer.py +0 -0
  434. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_serialization/test_3495_deserialize_managerlost.py +0 -0
  435. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_serialization/test_basic.py +0 -0
  436. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_serialization/test_htex_code_cache.py +0 -0
  437. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_serialization/test_pack_resource_spec.py +0 -0
  438. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_serialization/test_proxystore_configured.py +0 -0
  439. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_serialization/test_proxystore_impl.py +0 -0
  440. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_shutdown/__init__.py +0 -0
  441. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_shutdown/test_kill_monitoring.py +0 -0
  442. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_staging/__init__.py +0 -0
  443. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_staging/staging_provider.py +0 -0
  444. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_staging/test_1316.py +0 -0
  445. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_staging/test_docs_1.py +0 -0
  446. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_staging/test_docs_2.py +0 -0
  447. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
  448. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_staging/test_file.py +0 -0
  449. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_staging/test_file_apps.py +0 -0
  450. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_staging/test_file_staging.py +0 -0
  451. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_staging/test_output_chain_filenames.py +0 -0
  452. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
  453. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
  454. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_staging/test_staging_globus.py +0 -0
  455. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_staging/test_staging_https.py +0 -0
  456. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_staging/test_staging_stdout.py +0 -0
  457. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_staging/test_zip_in.py +0 -0
  458. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_staging/test_zip_out.py +0 -0
  459. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_staging/test_zip_to_zip.py +0 -0
  460. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_summary.py +0 -0
  461. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_thread_parallelism.py +0 -0
  462. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_threads/__init__.py +0 -0
  463. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_threads/test_configs.py +0 -0
  464. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
  465. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_utils/__init__.py +0 -0
  466. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/test_utils/test_representation_mixin.py +0 -0
  467. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/unit/__init__.py +0 -0
  468. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/unit/test_file.py +0 -0
  469. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/unit/test_usage_tracking.py +0 -0
  470. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/tests/utils.py +0 -0
  471. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/usage_tracking/__init__.py +0 -0
  472. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/usage_tracking/api.py +0 -0
  473. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/usage_tracking/levels.py +0 -0
  474. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/usage_tracking/usage.py +0 -0
  475. {parsl-2024.7.1 → parsl-2024.7.8}/parsl/utils.py +0 -0
  476. {parsl-2024.7.1 → parsl-2024.7.8}/parsl.egg-info/dependency_links.txt +0 -0
  477. {parsl-2024.7.1 → parsl-2024.7.8}/parsl.egg-info/entry_points.txt +0 -0
  478. {parsl-2024.7.1 → parsl-2024.7.8}/parsl.egg-info/requires.txt +0 -0
  479. {parsl-2024.7.1 → parsl-2024.7.8}/parsl.egg-info/top_level.txt +0 -0
  480. {parsl-2024.7.1 → parsl-2024.7.8}/requirements.txt +0 -0
  481. {parsl-2024.7.1 → parsl-2024.7.8}/setup.cfg +0 -0
  482. {parsl-2024.7.1 → parsl-2024.7.8}/setup.py +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: parsl
3
- Version: 2024.7.1
3
+ Version: 2024.7.8
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.07.01.tar.gz
6
+ Download-URL: https://github.com/Parsl/parsl/archive/2024.07.08.tar.gz
7
7
  Author: The Parsl Team
8
8
  Author-email: parsl@googlegroups.com
9
9
  License: Apache 2.0
@@ -66,6 +66,10 @@ class AppBase(metaclass=ABCMeta):
66
66
  self.kwargs['walltime'] = params['walltime'].default
67
67
  if 'parsl_resource_specification' in params:
68
68
  self.kwargs['parsl_resource_specification'] = params['parsl_resource_specification'].default
69
+ if 'outputs' in params:
70
+ self.kwargs['outputs'] = params['outputs'].default
71
+ if 'inputs' in params:
72
+ self.kwargs['inputs'] = params['inputs'].default
69
73
 
70
74
  @abstractmethod
71
75
  def __call__(self, *args: Any, **kwargs: Any) -> AppFuture:
@@ -227,8 +227,20 @@ class SSHChannel(Channel, RepresentationMixin):
227
227
 
228
228
  def close(self) -> None:
229
229
  if self._is_connected():
230
+ transport = self.ssh_client.get_transport()
230
231
  self.ssh_client.close()
231
232
 
233
+ # ssh_client.close calls transport.close, but transport.close does
234
+ # not always wait for the transport thread to be stopped. See impl
235
+ # of Transport.close in paramiko and issue
236
+ # https://github.com/paramiko/paramiko/issues/520
237
+ logger.debug("Waiting for transport thread to stop")
238
+ transport.join(30)
239
+ if transport.is_alive():
240
+ logger.warning("SSH transport thread did not shut down")
241
+ else:
242
+ logger.debug("SSH transport thread stopped")
243
+
232
244
  def isdir(self, path):
233
245
  """Return true if the path refers to an existing directory.
234
246
 
@@ -56,6 +56,8 @@ DEFAULT_LAUNCH_CMD = ("process_worker_pool.py {debug} {max_workers_per_node} "
56
56
  "--mpi-launcher={mpi_launcher} "
57
57
  "--available-accelerators {accelerators}")
58
58
 
59
+ DEFAULT_INTERCHANGE_LAUNCH_CMD = "interchange.py"
60
+
59
61
  GENERAL_HTEX_PARAM_DOCS = """provider : :class:`~parsl.providers.base.ExecutionProvider`
60
62
  Provider to access computation resources. Can be one of :class:`~parsl.providers.aws.aws.EC2Provider`,
61
63
  :class:`~parsl.providers.cobalt.cobalt.Cobalt`,
@@ -76,6 +78,10 @@ GENERAL_HTEX_PARAM_DOCS = """provider : :class:`~parsl.providers.base.ExecutionP
76
78
  cores_per_worker, nodes_per_block, heartbeat_period ,heartbeat_threshold, logdir). For example:
77
79
  launch_cmd="process_worker_pool.py {debug} -c {cores_per_worker} --task_url={task_url} --result_url={result_url}"
78
80
 
81
+ interchange_launch_cmd : str
82
+ Custom command line string to launch the interchange process from the executor. If undefined,
83
+ the executor will use the default "interchange.py" command.
84
+
79
85
  address : string
80
86
  An address to connect to the main Parsl process which is reachable from the network in which
81
87
  workers will be running. This field expects an IPv4 address (xxx.xxx.xxx.xxx).
@@ -231,6 +237,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
231
237
  label: str = 'HighThroughputExecutor',
232
238
  provider: ExecutionProvider = LocalProvider(),
233
239
  launch_cmd: Optional[str] = None,
240
+ interchange_launch_cmd: Optional[str] = None,
234
241
  address: Optional[str] = None,
235
242
  worker_ports: Optional[Tuple[int, int]] = None,
236
243
  worker_port_range: Optional[Tuple[int, int]] = (54000, 55000),
@@ -329,6 +336,10 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
329
336
  launch_cmd = DEFAULT_LAUNCH_CMD
330
337
  self.launch_cmd = launch_cmd
331
338
 
339
+ if not interchange_launch_cmd:
340
+ interchange_launch_cmd = DEFAULT_INTERCHANGE_LAUNCH_CMD
341
+ self.interchange_launch_cmd = interchange_launch_cmd
342
+
332
343
  radio_mode = "htex"
333
344
 
334
345
  def _warn_deprecated(self, old: str, new: str):
@@ -544,7 +555,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
544
555
 
545
556
  config_pickle = pickle.dumps(interchange_config)
546
557
 
547
- self.interchange_proc = subprocess.Popen(b"interchange.py", stdin=subprocess.PIPE)
558
+ self.interchange_proc = subprocess.Popen(self.interchange_launch_cmd.encode("utf-8"), stdin=subprocess.PIPE)
548
559
  stdin = self.interchange_proc.stdin
549
560
  assert stdin is not None, "Popen should have created an IO object (vs default None) because of PIPE mode"
550
561
 
@@ -38,6 +38,7 @@ class MPIExecutor(HighThroughputExecutor):
38
38
  label: str = 'MPIExecutor',
39
39
  provider: ExecutionProvider = LocalProvider(),
40
40
  launch_cmd: Optional[str] = None,
41
+ interchange_launch_cmd: Optional[str] = None,
41
42
  address: Optional[str] = None,
42
43
  worker_ports: Optional[Tuple[int, int]] = None,
43
44
  worker_port_range: Optional[Tuple[int, int]] = (54000, 55000),
@@ -66,6 +67,7 @@ class MPIExecutor(HighThroughputExecutor):
66
67
  label=label,
67
68
  provider=provider,
68
69
  launch_cmd=launch_cmd,
70
+ interchange_launch_cmd=interchange_launch_cmd,
69
71
  address=address,
70
72
  worker_ports=worker_ports,
71
73
  worker_port_range=worker_port_range,
@@ -9,7 +9,7 @@ import threading as mt
9
9
  import time
10
10
  from concurrent.futures import Future
11
11
  from functools import partial
12
- from pathlib import Path, PosixPath
12
+ from pathlib import PosixPath
13
13
  from typing import Dict, Optional
14
14
 
15
15
  import requests
@@ -24,7 +24,7 @@ from parsl.serialize import deserialize, pack_res_spec_apply_message
24
24
  from parsl.serialize.errors import DeserializationError, SerializationError
25
25
  from parsl.utils import RepresentationMixin
26
26
 
27
- from .rpex_resources import ResourceConfig
27
+ from .rpex_resources import CLIENT, MPI, ResourceConfig
28
28
 
29
29
  try:
30
30
  import radical.pilot as rp
@@ -59,7 +59,7 @@ class RadicalPilotExecutor(ParslExecutor, RepresentationMixin):
59
59
  ``rp.PilotManager`` and ``rp.TaskManager``.
60
60
  2. "translate": Unwrap, identify, and parse Parsl ``apps`` into ``rp.TaskDescription``.
61
61
  3. "submit": Submit Parsl apps to ``rp.TaskManager``.
62
- 4. "shut_down": Shut down the RADICAL-Pilot runtime and all associated components.
62
+ 4. "shutdown": Shut down the RADICAL-Pilot runtime and all associated components.
63
63
 
64
64
  Here is a diagram
65
65
 
@@ -138,19 +138,26 @@ class RadicalPilotExecutor(ParslExecutor, RepresentationMixin):
138
138
  self.future_tasks: Dict[str, Future] = {}
139
139
 
140
140
  if rpex_cfg:
141
- self.rpex_cfg = rpex_cfg
141
+ self.rpex_cfg = rpex_cfg.get_config()
142
142
  elif not rpex_cfg and 'local' in resource:
143
- self.rpex_cfg = ResourceConfig()
143
+ self.rpex_cfg = ResourceConfig().get_config()
144
144
  else:
145
- raise ValueError('Resource config file must be '
146
- 'specified for a non-local execution')
145
+ raise ValueError('Resource config must be '
146
+ 'specified for a non-local resources')
147
147
 
148
148
  def task_state_cb(self, task, state):
149
149
  """
150
150
  Update the state of Parsl Future apps
151
151
  Based on RP task state callbacks.
152
152
  """
153
- if not task.uid.startswith('master'):
153
+ # check the Master/Worker state
154
+ if task.mode in [rp.RAPTOR_MASTER, rp.RAPTOR_WORKER]:
155
+ if state == rp.FAILED:
156
+ exception = RuntimeError(f'{task.uid} failed with internal error: {task.stderr}')
157
+ self._fail_all_tasks(exception)
158
+
159
+ # check all other tasks state
160
+ else:
154
161
  parsl_task = self.future_tasks[task.uid]
155
162
 
156
163
  if state == rp.DONE:
@@ -186,6 +193,23 @@ class RadicalPilotExecutor(ParslExecutor, RepresentationMixin):
186
193
  else:
187
194
  parsl_task.set_exception('Task failed for an unknown reason')
188
195
 
196
+ def _fail_all_tasks(self, exception):
197
+ """
198
+ Fail all outstanding tasks with the given exception.
199
+
200
+ This method iterates through all outstanding tasks in the
201
+ `_future_tasks` dictionary, which have not yet completed,
202
+ and sets the provided exception as their result, indicating
203
+ a failure.
204
+
205
+ Parameters:
206
+ - exception: The exception to be set as the result for all
207
+ outstanding tasks.
208
+ """
209
+ for fut_task in self.future_tasks.values():
210
+ if not fut_task.done():
211
+ fut_task.set_exception(exception)
212
+
189
213
  def start(self):
190
214
  """Create the Pilot component and pass it.
191
215
  """
@@ -202,63 +226,62 @@ class RadicalPilotExecutor(ParslExecutor, RepresentationMixin):
202
226
  'resource': self.resource}
203
227
 
204
228
  if not self.resource or 'local' in self.resource:
205
- # move the agent sandbox to the working dir mainly
206
- # for debugging purposes. This will allow parsl
207
- # to include the agent sandbox with the ci artifacts.
208
- if os.environ.get("LOCAL_SANDBOX"):
209
- pd_init['sandbox'] = self.run_dir
210
- os.environ["RADICAL_LOG_LVL"] = "DEBUG"
211
-
212
- logger.info("RPEX will be running in the local mode")
229
+ os.environ["RADICAL_LOG_LVL"] = "DEBUG"
230
+ logger.info("RPEX will be running in local mode")
213
231
 
214
232
  pd = rp.PilotDescription(pd_init)
215
233
  pd.verify()
216
234
 
217
- self.rpex_cfg = self.rpex_cfg._get_cfg_file(path=self.run_dir)
218
- cfg = ru.Config(cfg=ru.read_json(self.rpex_cfg))
235
+ # start RP's main components TMGR, PMGR and Pilot
236
+ self.tmgr = rp.TaskManager(session=self.session)
237
+ self.pmgr = rp.PilotManager(session=self.session)
238
+ self.pilot = self.pmgr.submit_pilots(pd)
219
239
 
220
- self.master = cfg.master_descr
221
- self.n_masters = cfg.n_masters
240
+ if not self.pilot.description.get('cores') or not self.pilot.description.get('nodes'):
241
+ logger.warning('no "cores/nodes" per pilot were set, using default resources')
242
+
243
+ self.tmgr.add_pilots(self.pilot)
244
+ self.tmgr.register_callback(self.task_state_cb)
222
245
 
223
- tds = list()
224
- master_path = '{0}/rpex_master.py'.format(PWD)
225
246
  worker_path = '{0}/rpex_worker.py'.format(PWD)
226
247
 
227
- for i in range(self.n_masters):
228
- td = rp.TaskDescription(self.master)
229
- td.mode = rp.RAPTOR_MASTER
230
- td.uid = ru.generate_id('master.%(item_counter)06d', ru.ID_CUSTOM,
248
+ self.masters = []
249
+
250
+ logger.info(f'Starting {self.rpex_cfg.n_masters} masters and {self.rpex_cfg.n_workers} workers for each master')
251
+
252
+ # create N masters
253
+ for _ in range(self.rpex_cfg.n_masters):
254
+ md = rp.TaskDescription(self.rpex_cfg.master_descr)
255
+ md.uid = ru.generate_id('rpex.master.%(item_counter)06d', ru.ID_CUSTOM,
231
256
  ns=self.session.uid)
232
- td.ranks = 1
233
- td.cores_per_rank = 1
234
- td.arguments = [self.rpex_cfg, i]
235
- td.input_staging = self._stage_files([File(master_path),
236
- File(worker_path),
237
- File(self.rpex_cfg)], mode='in')
238
- tds.append(td)
239
257
 
240
- self.pmgr = rp.PilotManager(session=self.session)
241
- self.tmgr = rp.TaskManager(session=self.session)
258
+ # submit the master to the TMGR
259
+ master = self.tmgr.submit_raptors(md)[0]
260
+ self.masters.append(master)
242
261
 
243
- # submit pilot(s)
244
- pilot = self.pmgr.submit_pilots(pd)
245
- if not pilot.description.get('cores'):
246
- logger.warning('no "cores" per pilot was set, using default resources {0}'.format(pilot.resources))
262
+ workers = []
263
+ # create N workers for each master and submit them to the TMGR
264
+ for _ in range(self.rpex_cfg.n_workers):
265
+ wd = rp.TaskDescription(self.rpex_cfg.worker_descr)
266
+ wd.uid = ru.generate_id('rpex.worker.%(item_counter)06d', ru.ID_CUSTOM,
267
+ ns=self.session.uid)
268
+ wd.raptor_id = master.uid
269
+ wd.input_staging = self._stage_files([File(worker_path)], mode='in')
270
+ workers.append(wd)
247
271
 
248
- self.tmgr.submit_tasks(tds)
272
+ self.tmgr.submit_workers(workers)
273
+
274
+ self.select_master = self._cyclic_master_selector()
249
275
 
250
276
  # prepare or use the current env for the agent/pilot side environment
251
- if cfg.pilot_env_mode != 'client':
252
- logger.info("creating {0} environment for the executor".format(cfg.pilot_env.name))
253
- pilot.prepare_env(env_name=cfg.pilot_env.name,
254
- env_spec=cfg.pilot_env.as_dict())
277
+ if self.rpex_cfg.pilot_env_mode != CLIENT:
278
+ logger.info("creating {0} environment for the executor".format(self.rpex_cfg.pilot_env.name))
279
+ self.pilot.prepare_env(env_name=self.rpex_cfg.pilot_env.name,
280
+ env_spec=self.rpex_cfg.pilot_env.as_dict())
255
281
  else:
256
282
  client_env = sys.prefix
257
283
  logger.info("reusing ({0}) environment for the executor".format(client_env))
258
284
 
259
- self.tmgr.add_pilots(pilot)
260
- self.tmgr.register_callback(self.task_state_cb)
261
-
262
285
  # create a bulking thread to run the actual task submission
263
286
  # to RP in bulks
264
287
  if self.bulk_mode:
@@ -272,8 +295,21 @@ class RadicalPilotExecutor(ParslExecutor, RepresentationMixin):
272
295
  self._bulk_thread.daemon = True
273
296
  self._bulk_thread.start()
274
297
 
298
+ logger.info('bulk mode is on, submitting tasks in bulks')
299
+
275
300
  return True
276
301
 
302
+ def _cyclic_master_selector(self):
303
+ """
304
+ Balance tasks submission across N masters and N workers
305
+ """
306
+ current_master = 0
307
+ masters_uids = [m.uid for m in self.masters]
308
+
309
+ while True:
310
+ yield masters_uids[current_master]
311
+ current_master = (current_master + 1) % len(self.masters)
312
+
277
313
  def unwrap(self, func, args):
278
314
  """
279
315
  Unwrap a Parsl app and its args for further processing.
@@ -364,22 +400,25 @@ class RadicalPilotExecutor(ParslExecutor, RepresentationMixin):
364
400
 
365
401
  # This is the default mode where the bash_app will be executed as
366
402
  # as a single core process by RP. For cores > 1 the user must use
367
- # above or use MPI functions if their code is Python.
403
+ # task.mode=rp.TASK_EXECUTABLE (above) or use MPI functions if their
404
+ # code is Python.
368
405
  else:
369
406
  task.mode = rp.TASK_PROC
370
- task.raptor_id = 'master.%06d' % (tid % self.n_masters)
407
+ task.raptor_id = next(self.select_master)
371
408
  task.executable = self._pack_and_apply_message(func, args, kwargs)
372
409
 
373
410
  elif PYTHON in task_type or not task_type:
374
411
  task.mode = rp.TASK_FUNCTION
375
- task.raptor_id = 'master.%06d' % (tid % self.n_masters)
412
+ task.raptor_id = next(self.select_master)
376
413
  if kwargs.get('walltime'):
377
414
  func = timeout(func, kwargs['walltime'])
378
415
 
379
- # we process MPI function differently
380
- if 'comm' in kwargs:
416
+ # Check how to serialize the function object
417
+ if MPI in self.rpex_cfg.worker_type.lower():
418
+ task.use_mpi = True
381
419
  task.function = rp.PythonTask(func, *args, **kwargs)
382
420
  else:
421
+ task.use_mpi = False
383
422
  task.function = self._pack_and_apply_message(func, args, kwargs)
384
423
 
385
424
  task.input_staging = self._stage_files(kwargs.get("inputs", []),
@@ -394,7 +433,7 @@ class RadicalPilotExecutor(ParslExecutor, RepresentationMixin):
394
433
  try:
395
434
  task.verify()
396
435
  except ru.typeddict.TDKeyError as e:
397
- raise Exception(f'{e}. Please check Radical.Pilot TaskDescription documentation')
436
+ raise Exception(f'{e}. Please check: https://radicalpilot.readthedocs.io/en/stable/ documentation')
398
437
 
399
438
  return task
400
439
 
@@ -413,7 +452,11 @@ class RadicalPilotExecutor(ParslExecutor, RepresentationMixin):
413
452
 
414
453
  def _unpack_and_set_parsl_exception(self, parsl_task, exception):
415
454
  try:
416
- s = rp.utils.deserialize_bson(exception)
455
+ try:
456
+ s = rp.utils.deserialize_bson(exception)
457
+ except Exception:
458
+ s = exception
459
+
417
460
  if isinstance(s, RemoteExceptionWrapper):
418
461
  try:
419
462
  s.reraise()
@@ -421,6 +464,8 @@ class RadicalPilotExecutor(ParslExecutor, RepresentationMixin):
421
464
  parsl_task.set_exception(e)
422
465
  elif isinstance(s, Exception):
423
466
  parsl_task.set_exception(s)
467
+ elif isinstance(s, str):
468
+ parsl_task.set_exception(eval(s))
424
469
  else:
425
470
  raise ValueError("Unknown exception-like type received: {}".format(type(s)))
426
471
  except Exception as e:
@@ -440,16 +485,10 @@ class RadicalPilotExecutor(ParslExecutor, RepresentationMixin):
440
485
  elif isinstance(k_val, PosixPath):
441
486
  k_val = k_val.__str__()
442
487
 
443
- # if the stderr/out has no path
444
- # then we consider it local and
445
- # we just set the path to the cwd
446
- if '/' not in k_val:
447
- k_val = CWD + '/' + k_val
448
-
449
- # finally set the stderr/out to
450
- # the desired name by the user
488
+ # set the stderr/out to the desired
489
+ # name by the user
451
490
  setattr(task, k, k_val)
452
- task.sandbox = Path(k_val).parent.__str__()
491
+ task.sandbox = CWD
453
492
 
454
493
  def _stage_files(self, files, mode):
455
494
  """
@@ -477,7 +516,7 @@ class RadicalPilotExecutor(ParslExecutor, RepresentationMixin):
477
516
  # this indicates that the user
478
517
  # did not provided a specific
479
518
  # output file and RP will stage out
480
- # the task.output from pilot://task_folder
519
+ # the task.stdout from pilot://task_folder
481
520
  # to the CWD or file.url
482
521
  if '/' not in file.url:
483
522
  f = {'source': file.filename,
@@ -548,7 +587,8 @@ class RadicalPilotExecutor(ParslExecutor, RepresentationMixin):
548
587
 
549
588
  def shutdown(self, hub=True, targets='all', block=False):
550
589
  """Shutdown the executor, including all RADICAL-Pilot components."""
551
- logger.info("RadicalPilotExecutor shutdown")
590
+ logger.info("RadicalPilotExecutor is terminating...")
552
591
  self.session.close(download=True)
592
+ logger.info("RadicalPilotExecutor is terminated.")
553
593
 
554
594
  return True
@@ -5,6 +5,7 @@ from typing import List
5
5
  _setup_paths: List[str] = []
6
6
  try:
7
7
  import radical.pilot as rp
8
+ import radical.utils as ru
8
9
  except ImportError:
9
10
  pass
10
11
 
@@ -103,7 +104,7 @@ class ResourceConfig:
103
104
  python_v: str = f'{sys.version_info[0]}.{sys.version_info[1]}'
104
105
  worker_type: str = DEFAULT_WORKER
105
106
 
106
- def _get_cfg_file(cls, path=None):
107
+ def get_config(cls, path=None):
107
108
 
108
109
  # Default ENV mode for RP is to reuse
109
110
  # the client side. If this is not the case,
@@ -121,6 +122,7 @@ class ResourceConfig:
121
122
  cfg = {
122
123
  'n_masters': cls.masters,
123
124
  'n_workers': cls.workers,
125
+ 'worker_type': cls.worker_type,
124
126
  'gpus_per_node': cls.worker_gpus_per_node,
125
127
  'cores_per_node': cls.worker_cores_per_node,
126
128
  'cores_per_master': cls.cores_per_master,
@@ -138,9 +140,10 @@ class ResourceConfig:
138
140
  'pilot_env_mode': cls.pilot_env_mode,
139
141
 
140
142
  'master_descr': {
143
+ "ranks": 1,
144
+ "cores_per_rank": 1,
141
145
  "mode": rp.RAPTOR_MASTER,
142
146
  "named_env": cls.pilot_env_name,
143
- "executable": "python3 rpex_master.py",
144
147
  },
145
148
 
146
149
  'worker_descr': {
@@ -149,12 +152,16 @@ class ResourceConfig:
149
152
  "raptor_file": "./rpex_worker.py",
150
153
  "raptor_class": cls.worker_type if
151
154
  cls.worker_type.lower() != MPI else MPI_WORKER,
155
+ "ranks": cls.nodes_per_worker * cls.worker_cores_per_node,
156
+ "gpus_per_rank": cls.nodes_per_worker * cls.worker_gpus_per_node,
152
157
  }}
153
158
 
154
- # Convert the class instance to a cfg file.
155
- config_path = 'rpex.cfg'
159
+ # Convert the class instance to a Json file or a Config dict.
156
160
  if path:
161
+ config_path = 'rpex.cfg'
157
162
  config_path = path + '/' + config_path
158
- with open(config_path, 'w') as f:
159
- json.dump(cfg, f, indent=4)
160
- return config_path
163
+ with open(config_path, 'w') as f:
164
+ json.dump(cfg, f, indent=4)
165
+ else:
166
+ config_obj = ru.Config(from_dict=cfg)
167
+ return config_obj
@@ -168,10 +168,9 @@ class KubernetesProvider(ExecutionProvider, RepresentationMixin):
168
168
  - tasks_per_node (int) : command invocations to be launched per node
169
169
 
170
170
  Kwargs:
171
- - job_name (String): Name for job, must be unique
171
+ - job_name (String): Name for job
172
172
 
173
173
  Returns:
174
- - None: At capacity, cannot provision more
175
174
  - job_id: (string) Identifier for the job
176
175
  """
177
176
 
@@ -187,7 +186,7 @@ class KubernetesProvider(ExecutionProvider, RepresentationMixin):
187
186
  formatted_cmd = template_string.format(command=cmd_string,
188
187
  worker_init=self.worker_init)
189
188
 
190
- logger.debug("Pod name :{}".format(pod_name))
189
+ logger.debug("Pod name: %s", pod_name)
191
190
  self._create_pod(image=self.image,
192
191
  pod_name=pod_name,
193
192
  job_name=job_name,
@@ -0,0 +1,25 @@
1
+ import pytest
2
+
3
+ from parsl import AUTO_LOGNAME, Config, bash_app, python_app
4
+ from parsl.executors import ThreadPoolExecutor
5
+
6
+
7
+ def local_config():
8
+ return Config(executors=[ThreadPoolExecutor()])
9
+
10
+
11
+ @pytest.mark.local
12
+ def test_default_inputs():
13
+ @python_app
14
+ def identity(inp):
15
+ return inp
16
+
17
+ @bash_app
18
+ def sum_inputs(inputs=[identity(1), identity(2)], stdout=AUTO_LOGNAME):
19
+ calc = sum(inputs)
20
+ return f"echo {calc}"
21
+
22
+ fut = sum_inputs()
23
+ fut.result()
24
+ with open(fut.stdout, 'r') as f:
25
+ assert int(f.read()) == 3
@@ -136,3 +136,16 @@ def test_max_workers_per_node():
136
136
 
137
137
  # Ensure max_workers_per_node takes precedence
138
138
  assert htex.max_workers_per_node == htex.max_workers == 1
139
+
140
+
141
+ @pytest.mark.local
142
+ def test_htex_launch_cmd():
143
+ htex = HighThroughputExecutor()
144
+ assert htex.launch_cmd.startswith("process_worker_pool.py")
145
+ assert htex.interchange_launch_cmd == "interchange.py"
146
+
147
+ launch_cmd = "custom-launch-cmd"
148
+ ix_launch_cmd = "custom-ix-launch-cmd"
149
+ htex = HighThroughputExecutor(launch_cmd=launch_cmd, interchange_launch_cmd=ix_launch_cmd)
150
+ assert htex.launch_cmd == launch_cmd
151
+ assert htex.interchange_launch_cmd == ix_launch_cmd
@@ -92,19 +92,24 @@ def test_ssh_channel():
92
92
  # already exist, so create it here.
93
93
  pathlib.Path('{}/known.hosts'.format(config_dir)).touch(mode=0o600)
94
94
  script_dir = tempfile.mkdtemp()
95
- p = LocalProvider(channel=SSHChannel('127.0.0.1', port=server_port,
96
- script_dir=remote_script_dir,
97
- host_keys_filename='{}/known.hosts'.format(config_dir),
98
- key_filename=priv_key),
99
- launcher=SingleNodeLauncher(debug=False))
100
- p.script_dir = script_dir
101
- _run_tests(p)
95
+ channel = SSHChannel('127.0.0.1', port=server_port,
96
+ script_dir=remote_script_dir,
97
+ host_keys_filename='{}/known.hosts'.format(config_dir),
98
+ key_filename=priv_key)
99
+ try:
100
+ p = LocalProvider(channel=channel,
101
+ launcher=SingleNodeLauncher(debug=False))
102
+ p.script_dir = script_dir
103
+ _run_tests(p)
104
+ finally:
105
+ channel.close()
102
106
  finally:
103
107
  _stop_sshd(sshd_thread)
104
108
 
105
109
 
106
110
  def _stop_sshd(sshd_thread):
107
111
  sshd_thread.stop()
112
+ sshd_thread.join()
108
113
 
109
114
 
110
115
  class SSHDThread(threading.Thread):
@@ -0,0 +1,22 @@
1
+ import pytest
2
+
3
+ import parsl
4
+ from parsl import python_app
5
+ from parsl.executors.threads import ThreadPoolExecutor
6
+
7
+
8
+ def local_config():
9
+ return parsl.Config(executors=[ThreadPoolExecutor()])
10
+
11
+
12
+ @pytest.mark.local
13
+ def test_default_inputs():
14
+ @python_app
15
+ def identity(inp):
16
+ return inp
17
+
18
+ @python_app
19
+ def add_inputs(inputs=[identity(1), identity(2)]):
20
+ return sum(inputs)
21
+
22
+ assert add_inputs().result() == 3
@@ -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 = '2024.07.01'
6
+ VERSION = '2024.07.08'
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: parsl
3
- Version: 2024.7.1
3
+ Version: 2024.7.8
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.07.01.tar.gz
6
+ Download-URL: https://github.com/Parsl/parsl/archive/2024.07.08.tar.gz
7
7
  Author: The Parsl Team
8
8
  Author-email: parsl@googlegroups.com
9
9
  License: Apache 2.0
@@ -103,7 +103,6 @@ parsl/executors/high_throughput/process_worker_pool.py
103
103
  parsl/executors/high_throughput/zmq_pipes.py
104
104
  parsl/executors/radical/__init__.py
105
105
  parsl/executors/radical/executor.py
106
- parsl/executors/radical/rpex_master.py
107
106
  parsl/executors/radical/rpex_resources.py
108
107
  parsl/executors/radical/rpex_worker.py
109
108
  parsl/executors/taskvine/__init__.py
@@ -309,6 +308,7 @@ parsl/tests/test_bash_apps/__init__.py
309
308
  parsl/tests/test_bash_apps/test_apptimeout.py
310
309
  parsl/tests/test_bash_apps/test_basic.py
311
310
  parsl/tests/test_bash_apps/test_error_codes.py
311
+ parsl/tests/test_bash_apps/test_inputs_default.py
312
312
  parsl/tests/test_bash_apps/test_keyword_overlaps.py
313
313
  parsl/tests/test_bash_apps/test_kwarg_storage.py
314
314
  parsl/tests/test_bash_apps/test_memoize.py
@@ -400,6 +400,7 @@ parsl/tests/test_python_apps/test_fibonacci_recursive.py
400
400
  parsl/tests/test_python_apps/test_futures.py
401
401
  parsl/tests/test_python_apps/test_garbage_collect.py
402
402
  parsl/tests/test_python_apps/test_import_fail.py
403
+ parsl/tests/test_python_apps/test_inputs_default.py
403
404
  parsl/tests/test_python_apps/test_join.py
404
405
  parsl/tests/test_python_apps/test_lifted.py
405
406
  parsl/tests/test_python_apps/test_mapred.py