parsl 2023.11.13__tar.gz → 2023.11.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 (428) hide show
  1. {parsl-2023.11.13/parsl.egg-info → parsl-2023.11.20}/PKG-INFO +3 -2
  2. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/__init__.py +1 -0
  3. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/executors/base.py +0 -2
  4. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/executors/high_throughput/executor.py +1 -1
  5. parsl-2023.11.20/parsl/executors/radical/__init__.py +4 -0
  6. parsl-2023.11.20/parsl/executors/radical/executor.py +550 -0
  7. parsl-2023.11.20/parsl/executors/radical/rpex_master.py +42 -0
  8. parsl-2023.11.20/parsl/executors/radical/rpex_resources.py +165 -0
  9. parsl-2023.11.20/parsl/executors/radical/rpex_worker.py +61 -0
  10. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/executors/status_handling.py +0 -1
  11. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/jobs/job_status_poller.py +2 -3
  12. parsl-2023.11.20/parsl/tests/configs/local_radical.py +20 -0
  13. parsl-2023.11.20/parsl/tests/configs/local_radical_mpi.py +20 -0
  14. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_python_apps/test_garbage_collect.py +1 -1
  15. parsl-2023.11.20/parsl/tests/test_radical/test_mpi_funcs.py +27 -0
  16. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +1 -1
  17. parsl-2023.11.20/parsl/usage_tracking/__init__.py +0 -0
  18. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/version.py +1 -1
  19. {parsl-2023.11.13 → parsl-2023.11.20/parsl.egg-info}/PKG-INFO +3 -2
  20. {parsl-2023.11.13 → parsl-2023.11.20}/parsl.egg-info/SOURCES.txt +9 -0
  21. {parsl-2023.11.13 → parsl-2023.11.20}/parsl.egg-info/requires.txt +4 -0
  22. {parsl-2023.11.13 → parsl-2023.11.20}/setup.py +1 -0
  23. {parsl-2023.11.13 → parsl-2023.11.20}/LICENSE +0 -0
  24. {parsl-2023.11.13 → parsl-2023.11.20}/MANIFEST.in +0 -0
  25. {parsl-2023.11.13 → parsl-2023.11.20}/README.rst +0 -0
  26. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/addresses.py +0 -0
  27. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/app/__init__.py +0 -0
  28. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/app/app.py +0 -0
  29. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/app/bash.py +0 -0
  30. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/app/errors.py +0 -0
  31. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/app/futures.py +0 -0
  32. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/app/python.py +0 -0
  33. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/benchmark/__init__.py +0 -0
  34. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/benchmark/perf.py +0 -0
  35. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/channels/__init__.py +0 -0
  36. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/channels/base.py +0 -0
  37. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/channels/errors.py +0 -0
  38. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/channels/local/__init__.py +0 -0
  39. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/channels/local/local.py +0 -0
  40. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/channels/oauth_ssh/__init__.py +0 -0
  41. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/channels/oauth_ssh/oauth_ssh.py +0 -0
  42. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/channels/ssh/__init__.py +0 -0
  43. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/channels/ssh/ssh.py +0 -0
  44. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/channels/ssh_il/__init__.py +0 -0
  45. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/channels/ssh_il/ssh_il.py +0 -0
  46. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/concurrent/__init__.py +0 -0
  47. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/config.py +0 -0
  48. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/configs/ASPIRE1.py +0 -0
  49. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/configs/Azure.py +0 -0
  50. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/configs/__init__.py +0 -0
  51. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/configs/ad_hoc.py +0 -0
  52. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/configs/bluewaters.py +0 -0
  53. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/configs/bridges.py +0 -0
  54. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/configs/cc_in2p3.py +0 -0
  55. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/configs/comet.py +0 -0
  56. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/configs/cooley.py +0 -0
  57. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/configs/ec2.py +0 -0
  58. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/configs/frontera.py +0 -0
  59. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/configs/htex_local.py +0 -0
  60. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/configs/illinoiscluster.py +0 -0
  61. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/configs/kubernetes.py +0 -0
  62. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/configs/local_threads.py +0 -0
  63. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/configs/midway.py +0 -0
  64. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/configs/osg.py +0 -0
  65. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/configs/polaris.py +0 -0
  66. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/configs/stampede2.py +0 -0
  67. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/configs/summit.py +0 -0
  68. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/configs/theta.py +0 -0
  69. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/configs/toss3_llnl.py +0 -0
  70. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/configs/vineex_local.py +0 -0
  71. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/configs/wqex_local.py +0 -0
  72. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/data_provider/__init__.py +0 -0
  73. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/data_provider/data_manager.py +0 -0
  74. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/data_provider/file_noop.py +0 -0
  75. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/data_provider/files.py +0 -0
  76. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/data_provider/ftp.py +0 -0
  77. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/data_provider/globus.py +0 -0
  78. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/data_provider/http.py +0 -0
  79. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/data_provider/rsync.py +0 -0
  80. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/data_provider/staging.py +0 -0
  81. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/dataflow/__init__.py +0 -0
  82. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/dataflow/dflow.py +0 -0
  83. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/dataflow/errors.py +0 -0
  84. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/dataflow/futures.py +0 -0
  85. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/dataflow/memoization.py +0 -0
  86. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/dataflow/rundirs.py +0 -0
  87. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/dataflow/states.py +0 -0
  88. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/dataflow/taskrecord.py +0 -0
  89. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/errors.py +0 -0
  90. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/executors/__init__.py +0 -0
  91. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/executors/errors.py +0 -0
  92. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/executors/flux/__init__.py +0 -0
  93. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/executors/flux/execute_parsl_task.py +0 -0
  94. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/executors/flux/executor.py +0 -0
  95. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/executors/flux/flux_instance_manager.py +0 -0
  96. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/executors/high_throughput/__init__.py +0 -0
  97. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/executors/high_throughput/errors.py +0 -0
  98. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/executors/high_throughput/interchange.py +0 -0
  99. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/executors/high_throughput/manager_record.py +0 -0
  100. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/executors/high_throughput/monitoring_info.py +0 -0
  101. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/executors/high_throughput/probe.py +0 -0
  102. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/executors/high_throughput/process_worker_pool.py +0 -0
  103. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/executors/high_throughput/zmq_pipes.py +0 -0
  104. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/executors/taskvine/__init__.py +0 -0
  105. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/executors/taskvine/errors.py +0 -0
  106. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/executors/taskvine/exec_parsl_function.py +0 -0
  107. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/executors/taskvine/executor.py +0 -0
  108. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/executors/taskvine/factory.py +0 -0
  109. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/executors/taskvine/factory_config.py +0 -0
  110. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/executors/taskvine/manager.py +0 -0
  111. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/executors/taskvine/manager_config.py +0 -0
  112. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/executors/taskvine/utils.py +0 -0
  113. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/executors/threads.py +0 -0
  114. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/executors/workqueue/__init__.py +0 -0
  115. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/executors/workqueue/errors.py +0 -0
  116. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/executors/workqueue/exec_parsl_function.py +0 -0
  117. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/executors/workqueue/executor.py +0 -0
  118. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/executors/workqueue/parsl_coprocess.py +0 -0
  119. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
  120. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/jobs/__init__.py +0 -0
  121. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/jobs/error_handlers.py +0 -0
  122. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/jobs/errors.py +0 -0
  123. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/jobs/states.py +0 -0
  124. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/jobs/strategy.py +0 -0
  125. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/launchers/__init__.py +0 -0
  126. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/launchers/base.py +0 -0
  127. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/launchers/errors.py +0 -0
  128. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/launchers/launchers.py +0 -0
  129. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/log_utils.py +0 -0
  130. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/monitoring/__init__.py +0 -0
  131. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/monitoring/db_manager.py +0 -0
  132. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/monitoring/message_type.py +0 -0
  133. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/monitoring/monitoring.py +0 -0
  134. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/monitoring/queries/__init__.py +0 -0
  135. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/monitoring/queries/pandas.py +0 -0
  136. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/monitoring/radios.py +0 -0
  137. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/monitoring/remote.py +0 -0
  138. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/monitoring/types.py +0 -0
  139. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/monitoring/visualization/__init__.py +0 -0
  140. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/monitoring/visualization/app.py +0 -0
  141. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/monitoring/visualization/models.py +0 -0
  142. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/monitoring/visualization/plots/__init__.py +0 -0
  143. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
  144. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
  145. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/monitoring/visualization/plots/default/workflow_plots.py +0 -0
  146. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +0 -0
  147. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
  148. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
  149. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/monitoring/visualization/templates/app.html +0 -0
  150. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/monitoring/visualization/templates/dag.html +0 -0
  151. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/monitoring/visualization/templates/error.html +0 -0
  152. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/monitoring/visualization/templates/layout.html +0 -0
  153. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
  154. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/monitoring/visualization/templates/task.html +0 -0
  155. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/monitoring/visualization/templates/workflow.html +0 -0
  156. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
  157. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/monitoring/visualization/utils.py +0 -0
  158. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/monitoring/visualization/version.py +0 -0
  159. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/monitoring/visualization/views.py +0 -0
  160. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/multiprocessing.py +0 -0
  161. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/process_loggers.py +0 -0
  162. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/__init__.py +0 -0
  163. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/ad_hoc/__init__.py +0 -0
  164. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/ad_hoc/ad_hoc.py +0 -0
  165. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/aws/__init__.py +0 -0
  166. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/aws/aws.py +0 -0
  167. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/aws/template.py +0 -0
  168. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/azure/__init__.py +0 -0
  169. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/azure/azure.py +0 -0
  170. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/azure/template.py +0 -0
  171. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/base.py +0 -0
  172. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/cluster_provider.py +0 -0
  173. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/cobalt/__init__.py +0 -0
  174. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/cobalt/cobalt.py +0 -0
  175. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/cobalt/template.py +0 -0
  176. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/condor/__init__.py +0 -0
  177. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/condor/condor.py +0 -0
  178. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/condor/template.py +0 -0
  179. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/errors.py +0 -0
  180. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/googlecloud/__init__.py +0 -0
  181. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/googlecloud/googlecloud.py +0 -0
  182. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/grid_engine/__init__.py +0 -0
  183. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/grid_engine/grid_engine.py +0 -0
  184. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/grid_engine/template.py +0 -0
  185. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/kubernetes/__init__.py +0 -0
  186. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/kubernetes/kube.py +0 -0
  187. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/kubernetes/template.py +0 -0
  188. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/local/__init__.py +0 -0
  189. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/local/local.py +0 -0
  190. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/lsf/__init__.py +0 -0
  191. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/lsf/lsf.py +0 -0
  192. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/lsf/template.py +0 -0
  193. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/pbspro/__init__.py +0 -0
  194. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/pbspro/pbspro.py +0 -0
  195. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/pbspro/template.py +0 -0
  196. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/slurm/__init__.py +0 -0
  197. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/slurm/slurm.py +0 -0
  198. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/slurm/template.py +0 -0
  199. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/torque/__init__.py +0 -0
  200. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/torque/template.py +0 -0
  201. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/providers/torque/torque.py +0 -0
  202. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/py.typed +0 -0
  203. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/serialize/__init__.py +0 -0
  204. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/serialize/base.py +0 -0
  205. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/serialize/concretes.py +0 -0
  206. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/serialize/errors.py +0 -0
  207. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/serialize/facade.py +0 -0
  208. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/serialize/proxystore.py +0 -0
  209. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/__init__.py +0 -0
  210. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/callables_helper.py +0 -0
  211. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/__init__.py +0 -0
  212. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/ad_hoc_cluster_htex.py +0 -0
  213. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/azure_single_node.py +0 -0
  214. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/bluewaters.py +0 -0
  215. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/bridges.py +0 -0
  216. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/cc_in2p3.py +0 -0
  217. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/comet.py +0 -0
  218. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/cooley_htex.py +0 -0
  219. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/ec2_single_node.py +0 -0
  220. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/ec2_spot.py +0 -0
  221. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/frontera.py +0 -0
  222. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/htex_ad_hoc_cluster.py +0 -0
  223. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/htex_local.py +0 -0
  224. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/htex_local_alternate.py +0 -0
  225. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/htex_local_intask_staging.py +0 -0
  226. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/htex_local_rsync_staging.py +0 -0
  227. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/local_adhoc.py +0 -0
  228. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/local_threads.py +0 -0
  229. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
  230. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
  231. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/local_threads_checkpoint_periodic.py +0 -0
  232. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
  233. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
  234. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/local_threads_globus.py +0 -0
  235. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
  236. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/local_threads_monitoring.py +0 -0
  237. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/local_threads_no_cache.py +0 -0
  238. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/midway.py +0 -0
  239. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/nscc_singapore.py +0 -0
  240. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/osg_htex.py +0 -0
  241. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/petrelkube.py +0 -0
  242. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/summit.py +0 -0
  243. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/swan_htex.py +0 -0
  244. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/taskvine_ex.py +0 -0
  245. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/theta.py +0 -0
  246. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/user_opts.py +0 -0
  247. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/configs/workqueue_ex.py +0 -0
  248. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/conftest.py +0 -0
  249. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/integration/__init__.py +0 -0
  250. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/integration/latency.py +0 -0
  251. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/integration/test_apps/__init__.py +0 -0
  252. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/integration/test_channels/__init__.py +0 -0
  253. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/integration/test_channels/test_channels.py +0 -0
  254. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/integration/test_channels/test_local_channel.py +0 -0
  255. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/integration/test_channels/test_scp_1.py +0 -0
  256. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/integration/test_channels/test_ssh_1.py +0 -0
  257. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/integration/test_channels/test_ssh_errors.py +0 -0
  258. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/integration/test_channels/test_ssh_file_transport.py +0 -0
  259. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/integration/test_channels/test_ssh_interactive.py +0 -0
  260. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
  261. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/integration/test_stress/__init__.py +0 -0
  262. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
  263. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
  264. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/manual_tests/__init__.py +0 -0
  265. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/manual_tests/htex_local.py +0 -0
  266. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/manual_tests/test_ad_hoc_htex.py +0 -0
  267. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/manual_tests/test_basic.py +0 -0
  268. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/manual_tests/test_fan_in_out_htex_remote.py +0 -0
  269. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/manual_tests/test_log_filter.py +0 -0
  270. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/manual_tests/test_memory_limits.py +0 -0
  271. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/manual_tests/test_oauth_ssh.py +0 -0
  272. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/manual_tests/test_regression_220.py +0 -0
  273. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/manual_tests/test_udp_simple.py +0 -0
  274. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/manual_tests/test_worker_count.py +0 -0
  275. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/scaling_tests/__init__.py +0 -0
  276. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/scaling_tests/htex_local.py +0 -0
  277. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/scaling_tests/local_threads.py +0 -0
  278. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/scaling_tests/test_scale.py +0 -0
  279. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/scaling_tests/vineex_condor.py +0 -0
  280. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/scaling_tests/vineex_local.py +0 -0
  281. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/scaling_tests/wqex_condor.py +0 -0
  282. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/scaling_tests/wqex_local.py +0 -0
  283. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/site_tests/__init__.py +0 -0
  284. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/site_tests/site_config_selector.py +0 -0
  285. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/site_tests/test_provider.py +0 -0
  286. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/site_tests/test_site.py +0 -0
  287. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/sites/__init__.py +0 -0
  288. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/sites/test_affinity.py +0 -0
  289. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/sites/test_concurrent.py +0 -0
  290. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/sites/test_dynamic_executor.py +0 -0
  291. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/sites/test_ec2.py +0 -0
  292. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/sites/test_launchers.py +0 -0
  293. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/sites/test_local_adhoc.py +0 -0
  294. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/sites/test_mpi/__init__.py +0 -0
  295. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/sites/test_start_method.py +0 -0
  296. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/sites/test_worker_info.py +0 -0
  297. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_aalst_patterns.py +0 -0
  298. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_bash_apps/__init__.py +0 -0
  299. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
  300. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_bash_apps/test_basic.py +0 -0
  301. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
  302. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
  303. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -0
  304. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_bash_apps/test_memoize.py +0 -0
  305. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
  306. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
  307. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_bash_apps/test_multiline.py +0 -0
  308. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_bash_apps/test_pipeline.py +0 -0
  309. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_bash_apps/test_stdout.py +0 -0
  310. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_callables.py +0 -0
  311. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_channels/__init__.py +0 -0
  312. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_channels/test_large_output.py +0 -0
  313. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_checkpointing/__init__.py +0 -0
  314. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_checkpointing/test_periodic.py +0 -0
  315. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +0 -0
  316. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
  317. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_checkpointing/test_python_checkpoint_3.py +0 -0
  318. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
  319. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_checkpointing/test_regression_233.py +0 -0
  320. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
  321. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_checkpointing/test_task_exit.py +0 -0
  322. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_data/__init__.py +0 -0
  323. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_data/test_file.py +0 -0
  324. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_data/test_file_apps.py +0 -0
  325. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_data/test_file_staging.py +0 -0
  326. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_data/test_output_chain_filenames.py +0 -0
  327. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_docs/__init__.py +0 -0
  328. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_docs/test_from_slides.py +0 -0
  329. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_docs/test_kwargs.py +0 -0
  330. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
  331. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_docs/test_workflow1.py +0 -0
  332. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_docs/test_workflow2.py +0 -0
  333. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_docs/test_workflow4.py +0 -0
  334. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_error_handling/__init__.py +0 -0
  335. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_error_handling/test_fail.py +0 -0
  336. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_error_handling/test_htex_basic.py +0 -0
  337. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_error_handling/test_htex_missing_worker.py +0 -0
  338. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_error_handling/test_htex_worker_failure.py +0 -0
  339. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_error_handling/test_python_walltime.py +0 -0
  340. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_error_handling/test_rand_fail.py +0 -0
  341. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_error_handling/test_resource_spec.py +0 -0
  342. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_error_handling/test_retries.py +0 -0
  343. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
  344. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
  345. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
  346. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
  347. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_flowcontrol/__init__.py +0 -0
  348. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_flux.py +0 -0
  349. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_htex/__init__.py +0 -0
  350. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_htex/test_htex_zmq_binding.py +0 -0
  351. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_monitoring/__init__.py +0 -0
  352. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_monitoring/test_basic.py +0 -0
  353. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
  354. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_monitoring/test_fuzz_zmq.py +0 -0
  355. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_monitoring/test_memoization_representation.py +0 -0
  356. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
  357. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_providers/__init__.py +0 -0
  358. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_providers/test_local_provider.py +0 -0
  359. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_python_apps/__init__.py +0 -0
  360. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
  361. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_python_apps/test_basic.py +0 -0
  362. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_python_apps/test_dep_standard_futures.py +0 -0
  363. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
  364. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_python_apps/test_depfail_propagation.py +0 -0
  365. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_python_apps/test_fail.py +0 -0
  366. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
  367. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
  368. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_python_apps/test_futures.py +0 -0
  369. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
  370. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_python_apps/test_join.py +0 -0
  371. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_python_apps/test_lifted.py +0 -0
  372. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_python_apps/test_mapred.py +0 -0
  373. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
  374. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_python_apps/test_memoize_2.py +0 -0
  375. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
  376. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +0 -0
  377. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
  378. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
  379. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_python_apps/test_outputs.py +0 -0
  380. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_python_apps/test_overview.py +0 -0
  381. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_python_apps/test_pipeline.py +0 -0
  382. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_python_apps/test_simple.py +0 -0
  383. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_python_apps/test_timeout.py +0 -0
  384. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_python_apps/test_type5.py +0 -0
  385. {parsl-2023.11.13/parsl/tests/test_regression → parsl-2023.11.20/parsl/tests/test_radical}/__init__.py +0 -0
  386. {parsl-2023.11.13/parsl/tests/test_scaling → parsl-2023.11.20/parsl/tests/test_regression}/__init__.py +0 -0
  387. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_regression/test_1480.py +0 -0
  388. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_regression/test_1653.py +0 -0
  389. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_regression/test_221.py +0 -0
  390. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_regression/test_226.py +0 -0
  391. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_regression/test_2652.py +0 -0
  392. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_regression/test_69a.py +0 -0
  393. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_regression/test_854.py +0 -0
  394. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_regression/test_97_parallelism_0.py +0 -0
  395. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_regression/test_98.py +0 -0
  396. {parsl-2023.11.13/parsl/tests/test_serialization → parsl-2023.11.20/parsl/tests/test_scaling}/__init__.py +0 -0
  397. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_scaling/test_block_error_handler.py +0 -0
  398. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_scaling/test_regression_1621.py +0 -0
  399. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_scaling/test_scale_down.py +0 -0
  400. {parsl-2023.11.13/parsl/tests/test_staging → parsl-2023.11.20/parsl/tests/test_serialization}/__init__.py +0 -0
  401. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_serialization/test_2555_caching_deserializer.py +0 -0
  402. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_serialization/test_basic.py +0 -0
  403. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_serialization/test_proxystore_configured.py +0 -0
  404. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_serialization/test_proxystore_impl.py +0 -0
  405. {parsl-2023.11.13/parsl/tests/test_threads → parsl-2023.11.20/parsl/tests/test_staging}/__init__.py +0 -0
  406. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_staging/staging_provider.py +0 -0
  407. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_staging/test_1316.py +0 -0
  408. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_staging/test_docs_1.py +0 -0
  409. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_staging/test_docs_2.py +0 -0
  410. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
  411. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
  412. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
  413. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_staging/test_staging_globus.py +0 -0
  414. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_staging/test_staging_https.py +0 -0
  415. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_staging/test_staging_https_in_task.py +0 -0
  416. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_summary.py +0 -0
  417. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_thread_parallelism.py +0 -0
  418. {parsl-2023.11.13/parsl/usage_tracking → parsl-2023.11.20/parsl/tests/test_threads}/__init__.py +0 -0
  419. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_threads/test_configs.py +0 -0
  420. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
  421. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/tests/utils.py +0 -0
  422. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/usage_tracking/usage.py +0 -0
  423. {parsl-2023.11.13 → parsl-2023.11.20}/parsl/utils.py +0 -0
  424. {parsl-2023.11.13 → parsl-2023.11.20}/parsl.egg-info/dependency_links.txt +0 -0
  425. {parsl-2023.11.13 → parsl-2023.11.20}/parsl.egg-info/entry_points.txt +0 -0
  426. {parsl-2023.11.13 → parsl-2023.11.20}/parsl.egg-info/top_level.txt +0 -0
  427. {parsl-2023.11.13 → parsl-2023.11.20}/requirements.txt +0 -0
  428. {parsl-2023.11.13 → parsl-2023.11.20}/setup.cfg +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: parsl
3
- Version: 2023.11.13
3
+ Version: 2023.11.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/2023.11.13.tar.gz
6
+ Download-URL: https://github.com/Parsl/parsl/archive/2023.11.20.tar.gz
7
7
  Author: The Parsl Team
8
8
  Author-email: parsl@googlegroups.com
9
9
  License: Apache 2.0
@@ -28,6 +28,7 @@ Provides-Extra: azure
28
28
  Provides-Extra: workqueue
29
29
  Provides-Extra: flux
30
30
  Provides-Extra: proxystore
31
+ Provides-Extra: radical-pilot
31
32
  Provides-Extra: all
32
33
  License-File: LICENSE
33
34
 
@@ -62,6 +62,7 @@ __all__ = [
62
62
  'ThreadPoolExecutor',
63
63
  'HighThroughputExecutor',
64
64
  'WorkQueueExecutor',
65
+ 'RadicalPilotExecutor',
65
66
 
66
67
  # monitoring
67
68
  'MonitoringHub',
@@ -5,8 +5,6 @@ from typing_extensions import Literal, Self
5
5
 
6
6
  from parsl.jobs.states import JobStatus
7
7
 
8
- import parsl # noqa F401
9
-
10
8
 
11
9
  class ParslExecutor(metaclass=ABCMeta):
12
10
  """Executors are abstractions that represent available compute resources
@@ -8,7 +8,7 @@ import datetime
8
8
  import pickle
9
9
  import warnings
10
10
  from multiprocessing import Queue
11
- from typing import Dict, Sequence # noqa F401 (used in type annotation)
11
+ from typing import Dict, Sequence
12
12
  from typing import List, Optional, Tuple, Union, Callable
13
13
  import math
14
14
 
@@ -0,0 +1,4 @@
1
+ from parsl.executors.radical.executor import RadicalPilotExecutor
2
+ from parsl.executors.radical.rpex_resources import ResourceConfig
3
+
4
+ __all__ = ['RadicalPilotExecutor', 'ResourceConfig']
@@ -0,0 +1,550 @@
1
+ """RadicalPilotExecutor builds on the RADICAL-Pilot/Parsl
2
+ """
3
+ import os
4
+ import sys
5
+ import time
6
+ import parsl
7
+ import queue
8
+ import logging
9
+ import inspect
10
+ import requests
11
+ import typeguard
12
+ import threading as mt
13
+
14
+ from functools import partial
15
+ from typing import Optional, Dict
16
+ from pathlib import Path, PosixPath
17
+ from concurrent.futures import Future
18
+
19
+ from parsl.app.python import timeout
20
+ from .rpex_resources import ResourceConfig
21
+ from parsl.data_provider.files import File
22
+ from parsl.utils import RepresentationMixin
23
+ from parsl.app.errors import BashExitFailure
24
+ from parsl.executors.base import ParslExecutor
25
+ from parsl.app.errors import RemoteExceptionWrapper
26
+ from parsl.serialize import pack_apply_message, deserialize
27
+ from parsl.serialize.errors import SerializationError, DeserializationError
28
+
29
+ try:
30
+ import radical.pilot as rp
31
+ import radical.utils as ru
32
+ except ImportError:
33
+ _rp_enabled = False
34
+ else:
35
+ _rp_enabled = True
36
+
37
+
38
+ RPEX = 'RPEX'
39
+ BASH = 'bash'
40
+ PYTHON = 'python'
41
+
42
+ CWD = os.getcwd()
43
+ PWD = os.path.abspath(os.path.dirname(__file__))
44
+
45
+ PARSL_RP_RESOURCE_MAP = {'cores': 'ranks',
46
+ 'disk': 'lfs_per_rank',
47
+ 'memory': 'mem_per_rank'}
48
+
49
+ logger = logging.getLogger(__name__)
50
+
51
+
52
+ class RadicalPilotExecutor(ParslExecutor, RepresentationMixin):
53
+ """Executor is designed for executing heterogeneous tasks
54
+ in terms of type/resource.
55
+
56
+ The RadicalPilotExecutor system has the following components:
57
+
58
+ 1. "start" :creating the RADICAL-executor session and pilot.
59
+ 2. "translate":unwrap/identify/ out of parsl task and construct RP task.
60
+ 3. "submit" :translating and submitting Parsl tasks to Radical Pilot.
61
+ 4. "shut_down":shutting down the RADICAL-executor components.
62
+
63
+ Here is a diagram
64
+
65
+ .. code:: python
66
+
67
+ ----------------------------------------------------------------------------
68
+ Parsl Data Flow Kernel | Task Translator | rp.TaskManager
69
+ ---------------------------------------|-------------------|----------------
70
+ | |
71
+ -> Dep. check ------> Parsl_tasks{} <--+--> Parsl Task |
72
+ Data management +dfk.submit | | |
73
+ | v |
74
+ | RP Task(s) -> | submit(task)
75
+ ----------------------------------------------------------------------------
76
+
77
+ The RadicalPilotExecutor creates a ``rp.Session``, ``rp.TaskManager``,
78
+ and ``rp.PilotManager``. The executor receives the parsl apps from the
79
+ DFK and translates these apps (in-memory) into ``rp.TaskDescription``
80
+ object to be passed to the ``rp.TaskManager``. This executor has two
81
+ submission mechanisms:
82
+
83
+ 1. Default_mode: where the executor submits the tasks directly to
84
+ RADICAL-Pilot.
85
+
86
+ 2. Bulk_mode: where the executor accumulates N tasks (functions and
87
+ executables) and submit them.
88
+
89
+ Parameters
90
+ ----------
91
+ rpex_cfg : :class: `~parsl.executors.rpex_resources.ResourceConfig`
92
+ a dataclass specifying resource configuration.
93
+ Default is ResourceConfig instance.
94
+
95
+ label : str
96
+ Label for this executor instance.
97
+ Default is "RPEX".
98
+
99
+ bulk_mode : bool
100
+ Enable bulk mode submission and execution. Default is False (stream).
101
+
102
+ resource : Optional[str]
103
+ The resource name of the targeted HPC machine or cluster.
104
+ Default is local.localhost (user local machine).
105
+
106
+ runtime : int
107
+ The maximum runtime for the entire job in minutes.
108
+ Default is 30.
109
+
110
+ working_dir : str
111
+ The working dir to be used by the executor.
112
+
113
+ rpex_pilot_kwargs: Dict of kwargs that are passed directly to the rp.PilotDescription object.
114
+
115
+ For more information: https://radicalpilot.readthedocs.io/en/stable/
116
+ """
117
+
118
+ @typeguard.typechecked
119
+ def __init__(self,
120
+ resource: str,
121
+ label: str = RPEX,
122
+ bulk_mode: bool = False,
123
+ working_dir: Optional[str] = None,
124
+ rpex_cfg: Optional[ResourceConfig] = None, **rpex_pilot_kwargs):
125
+
126
+ super().__init__()
127
+ self.pmgr = None
128
+ self.tmgr = None
129
+ self.run_dir = '.'
130
+ self.label = label
131
+ self.session = None
132
+ self.resource = resource
133
+ self._uid = RPEX.lower()
134
+ self.bulk_mode = bulk_mode
135
+ self.working_dir = working_dir
136
+ self.pilot_kwargs = rpex_pilot_kwargs
137
+ self.future_tasks: Dict[str, Future] = {}
138
+
139
+ if rpex_cfg:
140
+ self.rpex_cfg = rpex_cfg
141
+ elif not rpex_cfg and 'local' in resource:
142
+ self.rpex_cfg = ResourceConfig()
143
+ else:
144
+ raise ValueError('Resource config file must be '
145
+ 'specified for a non-local execution')
146
+
147
+ def task_state_cb(self, task, state):
148
+ """
149
+ Update the state of Parsl Future tasks
150
+ Based on RP task state callbacks.
151
+ """
152
+ if not task.uid.startswith('master'):
153
+ parsl_task = self.future_tasks[task.uid]
154
+
155
+ if state == rp.DONE:
156
+ if task.description['mode'] in [rp.TASK_EXEC,
157
+ rp.TASK_PROC,
158
+ rp.TASK_EXECUTABLE]:
159
+ parsl_task.set_result(int(task.exit_code))
160
+ else:
161
+ # we do not support MPI function output
162
+ # serialization. TODO: To be fixed soon.
163
+ if not task.description.get('use_mpi'):
164
+ result = deserialize(eval(task.return_value))
165
+ parsl_task.set_result(result)
166
+ else:
167
+ parsl_task.set_result(task.return_value)
168
+
169
+ elif state == rp.CANCELED:
170
+ parsl_task.cancel()
171
+
172
+ elif state == rp.FAILED:
173
+ if task.description['mode'] in [rp.TASK_EXEC,
174
+ rp.TASK_EXECUTABLE]:
175
+ parsl_task.set_exception(BashExitFailure(task.name,
176
+ task.exit_code))
177
+ else:
178
+ if task.exception:
179
+ # unpack a serialized exception
180
+ if not task.description.get('use_mpi') or task.description['mode'] == rp.TASK_PROC:
181
+ self._unpack_and_set_parsl_exception(parsl_task, task.exception)
182
+ # we do not serialize mpi function exception
183
+ else:
184
+ parsl_task.set_exception(eval(task.exception))
185
+ else:
186
+ parsl_task.set_exception('Task failed for an unknown reason')
187
+
188
+ def start(self):
189
+ """Create the Pilot component and pass it.
190
+ """
191
+ logger.info("starting RadicalPilotExecutor")
192
+ logger.info('Parsl: {0}'.format(parsl.__version__))
193
+ logger.info('RADICAL pilot: {0}'.format(rp.version))
194
+ self.session = rp.Session(cfg={'base': self.run_dir},
195
+ uid=ru.generate_id('rpex.session',
196
+ mode=ru.ID_PRIVATE))
197
+ logger.info("RPEX session is created: {0}".format(self.session.path))
198
+
199
+ pd_init = {**self.pilot_kwargs,
200
+ 'exit_on_error': True,
201
+ 'resource': self.resource}
202
+
203
+ if not self.resource or 'local' in self.resource:
204
+ # move the agent sandbox to the working dir mainly
205
+ # for debugging purposes. This will allow parsl
206
+ # to include the agent sandbox with the ci artifacts.
207
+ if os.environ.get("LOCAL_SANDBOX"):
208
+ pd_init['sandbox'] = self.run_dir
209
+ os.environ["RADICAL_LOG_LVL"] = "DEBUG"
210
+
211
+ logger.info("RPEX will be running in the local mode")
212
+
213
+ pd = rp.PilotDescription(pd_init)
214
+ pd.verify()
215
+
216
+ self.rpex_cfg = self.rpex_cfg._get_cfg_file(path=self.run_dir)
217
+ cfg = ru.Config(cfg=ru.read_json(self.rpex_cfg))
218
+
219
+ self.master = cfg.master_descr
220
+ self.n_masters = cfg.n_masters
221
+
222
+ tds = list()
223
+ master_path = '{0}/rpex_master.py'.format(PWD)
224
+ worker_path = '{0}/rpex_worker.py'.format(PWD)
225
+
226
+ for i in range(self.n_masters):
227
+ td = rp.TaskDescription(self.master)
228
+ td.mode = rp.RAPTOR_MASTER
229
+ td.uid = ru.generate_id('master.%(item_counter)06d', ru.ID_CUSTOM,
230
+ ns=self.session.uid)
231
+ td.ranks = 1
232
+ td.cores_per_rank = 1
233
+ td.arguments = [self.rpex_cfg, i]
234
+ td.input_staging = self._stage_files([File(master_path),
235
+ File(worker_path),
236
+ File(self.rpex_cfg)], mode='in')
237
+ tds.append(td)
238
+
239
+ self.pmgr = rp.PilotManager(session=self.session)
240
+ self.tmgr = rp.TaskManager(session=self.session)
241
+
242
+ # submit pilot(s)
243
+ pilot = self.pmgr.submit_pilots(pd)
244
+ if not pilot.description.get('cores'):
245
+ logger.warning('no "cores" per pilot was set, using default resources {0}'.format(pilot.resources))
246
+
247
+ self.tmgr.submit_tasks(tds)
248
+
249
+ # prepare or use the current env for the agent/pilot side environment
250
+ if cfg.pilot_env_mode != 'client':
251
+ logger.info("creating {0} environment for the executor".format(cfg.pilot_env.name))
252
+ pilot.prepare_env(env_name=cfg.pilot_env.name,
253
+ env_spec=cfg.pilot_env.as_dict())
254
+ else:
255
+ client_env = sys.prefix
256
+ logger.info("reusing ({0}) environment for the executor".format(client_env))
257
+
258
+ self.tmgr.add_pilots(pilot)
259
+ self.tmgr.register_callback(self.task_state_cb)
260
+
261
+ # create a bulking thread to run the actual task submission
262
+ # to RP in bulks
263
+ if self.bulk_mode:
264
+ self._max_bulk_size = 1024
265
+ self._max_bulk_time = 3 # seconds
266
+ self._min_bulk_time = 0.1 # seconds
267
+
268
+ self._bulk_queue = queue.Queue()
269
+ self._bulk_thread = mt.Thread(target=self._bulk_collector)
270
+
271
+ self._bulk_thread.daemon = True
272
+ self._bulk_thread.start()
273
+
274
+ return True
275
+
276
+ def unwrap(self, func, args):
277
+ """
278
+ Unwrap a parsl app and its args for further processing.
279
+
280
+ Parameters
281
+ ----------
282
+ func : callable
283
+ The function to be unwrapped.
284
+
285
+ args : tuple
286
+ The arguments associated with the function.
287
+
288
+ Returns
289
+ -------
290
+ tuple
291
+ A tuple containing the unwrapped function, adjusted arguments,
292
+ and task type information.
293
+ """
294
+
295
+ task_type = ''
296
+
297
+ while hasattr(func, '__wrapped__'):
298
+ func = func.__wrapped__
299
+
300
+ try:
301
+ if isinstance(func, partial):
302
+ try:
303
+ task_type = inspect.getsource(func.args[0]).split('\n')[0]
304
+ if BASH in task_type:
305
+ task_type = BASH
306
+ func = func.args[0]
307
+ else:
308
+ task_type = PYTHON
309
+
310
+ except Exception:
311
+ logger.exception('unwrap failed')
312
+
313
+ return func, args, task_type
314
+
315
+ else:
316
+ task_type = inspect.getsource(func).split('\n')[0]
317
+ if PYTHON in task_type:
318
+ task_type = PYTHON
319
+ else:
320
+ task_type = ''
321
+ except Exception as e:
322
+ raise Exception('failed to obtain task type: {0}'.format(e))
323
+
324
+ return func, args, task_type
325
+
326
+ def task_translate(self, tid, func, parsl_resource_specification, args, kwargs):
327
+ """
328
+ Convert parsl function to RADICAL-Pilot rp.TaskDescription
329
+ """
330
+
331
+ task = rp.TaskDescription()
332
+ task.name = func.__name__
333
+
334
+ if parsl_resource_specification and isinstance(parsl_resource_specification, dict):
335
+ logger.debug('mapping parsl resource specifications >> rp resource specifications')
336
+ for key, val in parsl_resource_specification.items():
337
+ if key not in task.as_dict():
338
+ key = PARSL_RP_RESOURCE_MAP.get(key, None)
339
+ if not key:
340
+ logger.warning('ignoring "{0}" key from task resource specification as it is not supported by RP'.format(key))
341
+ continue
342
+ setattr(task, key, val)
343
+
344
+ func, args, task_type = self.unwrap(func, args)
345
+
346
+ if BASH in task_type:
347
+ if callable(func):
348
+ # if the user specifies the executable mode then we expect the
349
+ # a code in a file that need to be executed in an isolated env.
350
+ if parsl_resource_specification.get('mode') == rp.TASK_EXECUTABLE:
351
+ # These lines of code are from parsl/app/bash.py
352
+ try:
353
+ # Execute the func to get the command
354
+ bash_app = func(*args, **kwargs)
355
+ if not isinstance(bash_app, str):
356
+ raise ValueError("Expected a str for bash_app cmd,"
357
+ "got: {0}".format(type(bash_app)))
358
+ except AttributeError as e:
359
+ raise Exception("failed to obtain bash app cmd") from e
360
+
361
+ task.executable = bash_app
362
+ task.mode = rp.TASK_EXECUTABLE
363
+
364
+ # This is the default mode where the bash_app will be executed as
365
+ # as a single core process by RP. For cores > 1 the user must use
366
+ # above or use MPI functions if their code is Python.
367
+ else:
368
+ task.mode = rp.TASK_PROC
369
+ task.raptor_id = 'master.%06d' % (tid % self.n_masters)
370
+ task.executable = self._pack_and_apply_message(func, args, kwargs)
371
+
372
+ elif PYTHON in task_type or not task_type:
373
+ task.mode = rp.TASK_FUNCTION
374
+ task.raptor_id = 'master.%06d' % (tid % self.n_masters)
375
+ if kwargs.get('walltime'):
376
+ func = timeout(func, kwargs['walltime'])
377
+
378
+ # we process MPI function differently
379
+ if 'comm' in kwargs:
380
+ task.function = rp.PythonTask(func, *args, **kwargs)
381
+ else:
382
+ task.function = self._pack_and_apply_message(func, args, kwargs)
383
+
384
+ task.input_staging = self._stage_files(kwargs.get("inputs", []),
385
+ mode='in')
386
+ task.output_staging = self._stage_files(kwargs.get("outputs", []),
387
+ mode='out')
388
+
389
+ task.input_staging.extend(self._stage_files(list(args), mode='in'))
390
+
391
+ self._set_stdout_stderr(task, kwargs)
392
+
393
+ try:
394
+ task.verify()
395
+ except ru.typeddict.TDKeyError as e:
396
+ raise Exception(f'{e}. Please check Radical.Pilot TaskDescription documentation')
397
+
398
+ return task
399
+
400
+ def _pack_and_apply_message(self, func, args, kwargs):
401
+ try:
402
+ buffer = pack_apply_message(func, args, kwargs,
403
+ buffer_threshold=1024 * 1024)
404
+ task_func = rp.utils.serialize_bson(buffer)
405
+ except TypeError:
406
+ raise SerializationError(func.__name__)
407
+
408
+ return task_func
409
+
410
+ def _unpack_and_set_parsl_exception(self, parsl_task, exception):
411
+ try:
412
+ s = rp.utils.deserialize_bson(exception)
413
+ if isinstance(s, RemoteExceptionWrapper):
414
+ try:
415
+ s.reraise()
416
+ except Exception as e:
417
+ parsl_task.set_exception(e)
418
+ elif isinstance(s, Exception):
419
+ parsl_task.set_exception(s)
420
+ else:
421
+ raise ValueError("Unknown exception-like type received: {}".format(type(s)))
422
+ except Exception as e:
423
+ parsl_task.set_exception(
424
+ DeserializationError("Received exception, but handling also threw an exception: {}".format(e)))
425
+
426
+ def _set_stdout_stderr(self, task, kwargs):
427
+ """
428
+ set the stdout and stderr of a task
429
+ """
430
+ for k in ['stdout', 'stderr']:
431
+ k_val = kwargs.get(k, '')
432
+ if k_val:
433
+ # check the type of the stderr/out
434
+ if isinstance(k_val, File):
435
+ k_val = k_val.filepath
436
+ elif isinstance(k_val, PosixPath):
437
+ k_val = k_val.__str__()
438
+
439
+ # if the stderr/out has no path
440
+ # then we consider it local and
441
+ # we just set the path to the cwd
442
+ if '/' not in k_val:
443
+ k_val = CWD + '/' + k_val
444
+
445
+ # finally set the stderr/out to
446
+ # the desired name by the user
447
+ setattr(task, k, k_val)
448
+ task.sandbox = Path(k_val).parent.__str__()
449
+
450
+ def _stage_files(self, files, mode):
451
+ """
452
+ a function to stage list of input/output
453
+ files between two locations.
454
+ """
455
+ to_stage = []
456
+ files = [f for f in files if isinstance(f, File)]
457
+ for file in files:
458
+ if mode == 'in':
459
+ # a workaround RP not supporting
460
+ # staging https file
461
+ if file.scheme == 'https':
462
+ r = requests.get(file.url)
463
+ p = CWD + '/' + file.filename
464
+ with open(p, 'wb') as ff:
465
+ ff.write(r.content)
466
+ file = File(p)
467
+
468
+ f = {'source': file.url,
469
+ 'action': rp.TRANSFER}
470
+ to_stage.append(f)
471
+
472
+ elif mode == 'out':
473
+ # this indicates that the user
474
+ # did not provided a specific
475
+ # output file and RP will stage out
476
+ # the task.output from pilot://task_folder
477
+ # to the CWD or file.url
478
+ if '/' not in file.url:
479
+ f = {'source': file.filename,
480
+ 'target': file.url,
481
+ 'action': rp.TRANSFER}
482
+ to_stage.append(f)
483
+ else:
484
+ raise ValueError('unknown staging mode')
485
+
486
+ return to_stage
487
+
488
+ def _bulk_collector(self):
489
+
490
+ bulk = list()
491
+
492
+ while True:
493
+
494
+ now = time.time() # time of last submission
495
+
496
+ # collect tasks for min bulk time
497
+ # NOTE: total collect time could actually be max_time + min_time
498
+ while time.time() - now < self._max_bulk_time:
499
+
500
+ try:
501
+ task = self._bulk_queue.get(block=True,
502
+ timeout=self._min_bulk_time)
503
+ except queue.Empty:
504
+ task = None
505
+
506
+ if task:
507
+ bulk.append(task)
508
+
509
+ if len(bulk) >= self._max_bulk_size:
510
+ break
511
+
512
+ if bulk:
513
+ logger.debug('submit bulk: %d', len(bulk))
514
+ self.tmgr.submit_tasks(bulk)
515
+ bulk = list()
516
+
517
+ def submit(self, func, resource_specification, *args, **kwargs):
518
+ """
519
+ Submits tasks in stream mode or bulks (bulk mode)
520
+ to RADICAL-Pilot rp.TaskManager.
521
+ """
522
+ rp_tid = ru.generate_id('task.%(item_counter)06d', ru.ID_CUSTOM,
523
+ ns=self.session.uid)
524
+ parsl_tid = int(rp_tid.split('task.')[1])
525
+
526
+ logger.debug("got Task {0} from parsl-dfk".format(parsl_tid))
527
+ task = self.task_translate(parsl_tid, func, resource_specification, args, kwargs)
528
+
529
+ # assign task id for rp task
530
+ task.uid = rp_tid
531
+
532
+ # set the future with corresponding id
533
+ self.future_tasks[rp_tid] = Future()
534
+
535
+ if self.bulk_mode:
536
+ # push task to rp submit thread
537
+ self._bulk_queue.put(task)
538
+ else:
539
+ # submit the task to rp
540
+ logger.debug("put {0} to rp-TMGR".format(rp_tid))
541
+ self.tmgr.submit_tasks(task)
542
+
543
+ return self.future_tasks[rp_tid]
544
+
545
+ def shutdown(self, hub=True, targets='all', block=False):
546
+ """Shutdown the executor, including all RADICAL-Pilot components."""
547
+ logger.info("RadicalPilotExecutor shutdown")
548
+ self.session.close(download=True)
549
+
550
+ return True
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env python3
2
+
3
+ import sys
4
+
5
+ import radical.utils as ru
6
+ import radical.pilot as rp
7
+
8
+
9
+ # ------------------------------------------------------------------------------
10
+ #
11
+ if __name__ == '__main__':
12
+
13
+ # The purpose of this master is to (a) spawn a set or workers
14
+ # within the same allocation, (b) to distribute work items to
15
+ # those workers, and (c) to collect the responses again.
16
+ cfg_fname = str(sys.argv[1])
17
+ cfg = ru.Config(cfg=ru.read_json(cfg_fname))
18
+ cfg.rank = int(sys.argv[2])
19
+
20
+ worker_descr = cfg.worker_descr
21
+ n_workers = cfg.n_workers
22
+ gpus_per_node = cfg.gpus_per_node
23
+ cores_per_node = cfg.cores_per_node
24
+ nodes_per_worker = cfg.nodes_per_worker
25
+
26
+ # create a master class instance - this will establish communication
27
+ # to the pilot agent
28
+ master = rp.raptor.Master(cfg)
29
+
30
+ # insert `n` worker into the agent. The agent will schedule (place)
31
+ # those workers and execute them.
32
+ worker_descr['ranks'] = nodes_per_worker * cores_per_node
33
+ worker_descr['gpus_per_rank'] = nodes_per_worker * gpus_per_node
34
+ worker_ids = master.submit_workers(
35
+ [rp.TaskDescription(worker_descr) for _ in range(n_workers)])
36
+
37
+ # wait for all workers
38
+ master.wait_workers()
39
+ master.start()
40
+ master.join()
41
+
42
+ # ------------------------------------------------------------------------------