parsl 2024.11.18__tar.gz → 2024.11.25__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 (466) hide show
  1. {parsl-2024.11.18/parsl.egg-info → parsl-2024.11.25}/PKG-INFO +2 -2
  2. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/addresses.py +19 -1
  3. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/curvezmq.py +4 -0
  4. parsl-2024.11.25/parsl/executors/execute_task.py +37 -0
  5. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/flux/execute_parsl_task.py +1 -1
  6. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/high_throughput/executor.py +14 -5
  7. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/high_throughput/interchange.py +8 -7
  8. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/high_throughput/mpi_executor.py +2 -0
  9. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/high_throughput/mpi_resource_management.py +2 -3
  10. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/high_throughput/probe.py +4 -4
  11. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/high_throughput/process_worker_pool.py +15 -43
  12. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/high_throughput/zmq_pipes.py +5 -4
  13. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/radical/rpex_worker.py +2 -2
  14. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/workqueue/exec_parsl_function.py +1 -1
  15. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/serialize/facade.py +3 -3
  16. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/configs/htex_local.py +1 -0
  17. parsl-2024.11.25/parsl/tests/test_execute_task.py +29 -0
  18. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_htex/test_zmq_binding.py +3 -2
  19. parsl-2024.11.25/parsl/tests/unit/test_address.py +20 -0
  20. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/version.py +1 -1
  21. {parsl-2024.11.18 → parsl-2024.11.25/parsl.egg-info}/PKG-INFO +2 -2
  22. {parsl-2024.11.18 → parsl-2024.11.25}/parsl.egg-info/SOURCES.txt +3 -0
  23. {parsl-2024.11.18 → parsl-2024.11.25}/LICENSE +0 -0
  24. {parsl-2024.11.18 → parsl-2024.11.25}/MANIFEST.in +0 -0
  25. {parsl-2024.11.18 → parsl-2024.11.25}/README.rst +0 -0
  26. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/__init__.py +0 -0
  27. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/app/__init__.py +0 -0
  28. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/app/app.py +0 -0
  29. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/app/bash.py +0 -0
  30. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/app/errors.py +0 -0
  31. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/app/futures.py +0 -0
  32. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/app/python.py +0 -0
  33. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/benchmark/__init__.py +0 -0
  34. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/benchmark/perf.py +0 -0
  35. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/channels/__init__.py +0 -0
  36. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/channels/base.py +0 -0
  37. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/channels/errors.py +0 -0
  38. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/channels/local/__init__.py +0 -0
  39. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/channels/local/local.py +0 -0
  40. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/concurrent/__init__.py +0 -0
  41. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/config.py +0 -0
  42. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/configs/ASPIRE1.py +0 -0
  43. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/configs/Azure.py +0 -0
  44. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/configs/__init__.py +0 -0
  45. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/configs/bridges.py +0 -0
  46. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/configs/cc_in2p3.py +0 -0
  47. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/configs/ec2.py +0 -0
  48. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/configs/expanse.py +0 -0
  49. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/configs/frontera.py +0 -0
  50. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/configs/htex_local.py +0 -0
  51. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/configs/illinoiscluster.py +0 -0
  52. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/configs/improv.py +0 -0
  53. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/configs/kubernetes.py +0 -0
  54. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/configs/local_threads.py +0 -0
  55. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/configs/midway.py +0 -0
  56. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/configs/osg.py +0 -0
  57. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/configs/polaris.py +0 -0
  58. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/configs/stampede2.py +0 -0
  59. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/configs/summit.py +0 -0
  60. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/configs/toss3_llnl.py +0 -0
  61. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/configs/vineex_local.py +0 -0
  62. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/configs/wqex_local.py +0 -0
  63. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/data_provider/__init__.py +0 -0
  64. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/data_provider/data_manager.py +0 -0
  65. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/data_provider/file_noop.py +0 -0
  66. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/data_provider/files.py +0 -0
  67. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/data_provider/ftp.py +0 -0
  68. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/data_provider/globus.py +0 -0
  69. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/data_provider/http.py +0 -0
  70. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/data_provider/rsync.py +0 -0
  71. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/data_provider/staging.py +0 -0
  72. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/data_provider/zip.py +0 -0
  73. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/dataflow/__init__.py +0 -0
  74. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/dataflow/dependency_resolvers.py +0 -0
  75. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/dataflow/dflow.py +0 -0
  76. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/dataflow/errors.py +0 -0
  77. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/dataflow/futures.py +0 -0
  78. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/dataflow/memoization.py +0 -0
  79. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/dataflow/rundirs.py +0 -0
  80. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/dataflow/states.py +0 -0
  81. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/dataflow/taskrecord.py +0 -0
  82. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/errors.py +0 -0
  83. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/__init__.py +0 -0
  84. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/base.py +0 -0
  85. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/errors.py +0 -0
  86. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/flux/__init__.py +0 -0
  87. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/flux/executor.py +0 -0
  88. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/flux/flux_instance_manager.py +0 -0
  89. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/high_throughput/__init__.py +0 -0
  90. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/high_throughput/errors.py +0 -0
  91. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/high_throughput/manager_record.py +0 -0
  92. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/high_throughput/manager_selector.py +0 -0
  93. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/high_throughput/monitoring_info.py +0 -0
  94. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/high_throughput/mpi_prefix_composer.py +0 -0
  95. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/radical/__init__.py +0 -0
  96. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/radical/executor.py +0 -0
  97. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/radical/rpex_resources.py +0 -0
  98. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/status_handling.py +0 -0
  99. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/taskvine/__init__.py +0 -0
  100. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/taskvine/errors.py +0 -0
  101. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/taskvine/exec_parsl_function.py +0 -0
  102. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/taskvine/executor.py +0 -0
  103. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/taskvine/factory.py +0 -0
  104. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/taskvine/factory_config.py +0 -0
  105. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/taskvine/manager.py +0 -0
  106. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/taskvine/manager_config.py +0 -0
  107. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/taskvine/utils.py +0 -0
  108. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/threads.py +0 -0
  109. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/workqueue/__init__.py +0 -0
  110. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/workqueue/errors.py +0 -0
  111. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/workqueue/executor.py +0 -0
  112. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/workqueue/parsl_coprocess.py +0 -0
  113. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
  114. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/jobs/__init__.py +0 -0
  115. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/jobs/error_handlers.py +0 -0
  116. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/jobs/errors.py +0 -0
  117. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/jobs/job_status_poller.py +0 -0
  118. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/jobs/states.py +0 -0
  119. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/jobs/strategy.py +0 -0
  120. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/launchers/__init__.py +0 -0
  121. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/launchers/base.py +0 -0
  122. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/launchers/errors.py +0 -0
  123. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/launchers/launchers.py +0 -0
  124. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/log_utils.py +0 -0
  125. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/monitoring/__init__.py +0 -0
  126. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/monitoring/db_manager.py +0 -0
  127. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/monitoring/errors.py +0 -0
  128. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/monitoring/message_type.py +0 -0
  129. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/monitoring/monitoring.py +0 -0
  130. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/monitoring/queries/__init__.py +0 -0
  131. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/monitoring/queries/pandas.py +0 -0
  132. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/monitoring/radios.py +0 -0
  133. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/monitoring/remote.py +0 -0
  134. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/monitoring/router.py +0 -0
  135. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/monitoring/types.py +0 -0
  136. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/monitoring/visualization/__init__.py +0 -0
  137. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/monitoring/visualization/app.py +0 -0
  138. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/monitoring/visualization/models.py +0 -0
  139. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/monitoring/visualization/plots/__init__.py +0 -0
  140. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
  141. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
  142. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/monitoring/visualization/plots/default/workflow_plots.py +0 -0
  143. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +0 -0
  144. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
  145. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
  146. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/monitoring/visualization/templates/app.html +0 -0
  147. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/monitoring/visualization/templates/dag.html +0 -0
  148. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/monitoring/visualization/templates/error.html +0 -0
  149. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/monitoring/visualization/templates/layout.html +0 -0
  150. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
  151. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/monitoring/visualization/templates/task.html +0 -0
  152. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/monitoring/visualization/templates/workflow.html +0 -0
  153. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
  154. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/monitoring/visualization/utils.py +0 -0
  155. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/monitoring/visualization/version.py +0 -0
  156. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/monitoring/visualization/views.py +0 -0
  157. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/multiprocessing.py +0 -0
  158. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/process_loggers.py +0 -0
  159. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/providers/__init__.py +0 -0
  160. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/providers/aws/__init__.py +0 -0
  161. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/providers/aws/aws.py +0 -0
  162. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/providers/aws/template.py +0 -0
  163. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/providers/azure/__init__.py +0 -0
  164. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/providers/azure/azure.py +0 -0
  165. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/providers/azure/template.py +0 -0
  166. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/providers/base.py +0 -0
  167. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/providers/cluster_provider.py +0 -0
  168. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/providers/condor/__init__.py +0 -0
  169. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/providers/condor/condor.py +0 -0
  170. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/providers/condor/template.py +0 -0
  171. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/providers/errors.py +0 -0
  172. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/providers/googlecloud/__init__.py +0 -0
  173. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/providers/googlecloud/googlecloud.py +0 -0
  174. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/providers/grid_engine/__init__.py +0 -0
  175. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/providers/grid_engine/grid_engine.py +0 -0
  176. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/providers/grid_engine/template.py +0 -0
  177. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/providers/kubernetes/__init__.py +0 -0
  178. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/providers/kubernetes/kube.py +0 -0
  179. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/providers/kubernetes/template.py +0 -0
  180. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/providers/local/__init__.py +0 -0
  181. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/providers/local/local.py +0 -0
  182. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/providers/lsf/__init__.py +0 -0
  183. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/providers/lsf/lsf.py +0 -0
  184. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/providers/lsf/template.py +0 -0
  185. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/providers/pbspro/__init__.py +0 -0
  186. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/providers/pbspro/pbspro.py +0 -0
  187. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/providers/pbspro/template.py +0 -0
  188. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/providers/slurm/__init__.py +0 -0
  189. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/providers/slurm/slurm.py +0 -0
  190. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/providers/slurm/template.py +0 -0
  191. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/providers/torque/__init__.py +0 -0
  192. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/providers/torque/template.py +0 -0
  193. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/providers/torque/torque.py +0 -0
  194. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/py.typed +0 -0
  195. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/serialize/__init__.py +0 -0
  196. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/serialize/base.py +0 -0
  197. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/serialize/concretes.py +0 -0
  198. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/serialize/errors.py +0 -0
  199. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/serialize/proxystore.py +0 -0
  200. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/__init__.py +0 -0
  201. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/callables_helper.py +0 -0
  202. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/configs/__init__.py +0 -0
  203. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/configs/azure_single_node.py +0 -0
  204. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/configs/bluewaters.py +0 -0
  205. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/configs/bridges.py +0 -0
  206. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/configs/cc_in2p3.py +0 -0
  207. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/configs/comet.py +0 -0
  208. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/configs/ec2_single_node.py +0 -0
  209. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/configs/ec2_spot.py +0 -0
  210. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/configs/flux_local.py +0 -0
  211. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/configs/frontera.py +0 -0
  212. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/configs/htex_local_alternate.py +0 -0
  213. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/configs/htex_local_intask_staging.py +0 -0
  214. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/configs/htex_local_rsync_staging.py +0 -0
  215. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/configs/local_radical.py +0 -0
  216. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/configs/local_radical_mpi.py +0 -0
  217. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/configs/local_threads.py +0 -0
  218. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
  219. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
  220. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/configs/local_threads_checkpoint_periodic.py +0 -0
  221. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
  222. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
  223. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/configs/local_threads_globus.py +0 -0
  224. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
  225. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/configs/local_threads_monitoring.py +0 -0
  226. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/configs/local_threads_no_cache.py +0 -0
  227. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/configs/midway.py +0 -0
  228. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/configs/nscc_singapore.py +0 -0
  229. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/configs/osg_htex.py +0 -0
  230. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/configs/petrelkube.py +0 -0
  231. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/configs/slurm_local.py +0 -0
  232. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/configs/summit.py +0 -0
  233. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/configs/taskvine_ex.py +0 -0
  234. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/configs/user_opts.py +0 -0
  235. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/configs/workqueue_ex.py +0 -0
  236. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/conftest.py +0 -0
  237. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/integration/__init__.py +0 -0
  238. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/integration/latency.py +0 -0
  239. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/integration/test_apps/__init__.py +0 -0
  240. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/integration/test_channels/__init__.py +0 -0
  241. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
  242. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/integration/test_stress/__init__.py +0 -0
  243. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
  244. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
  245. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/manual_tests/__init__.py +0 -0
  246. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/manual_tests/htex_local.py +0 -0
  247. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/manual_tests/test_basic.py +0 -0
  248. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/manual_tests/test_log_filter.py +0 -0
  249. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/manual_tests/test_memory_limits.py +0 -0
  250. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/manual_tests/test_regression_220.py +0 -0
  251. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/manual_tests/test_udp_simple.py +0 -0
  252. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/manual_tests/test_worker_count.py +0 -0
  253. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/scaling_tests/__init__.py +0 -0
  254. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/scaling_tests/htex_local.py +0 -0
  255. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/scaling_tests/local_threads.py +0 -0
  256. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/scaling_tests/test_scale.py +0 -0
  257. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/scaling_tests/vineex_condor.py +0 -0
  258. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/scaling_tests/vineex_local.py +0 -0
  259. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/scaling_tests/wqex_condor.py +0 -0
  260. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/scaling_tests/wqex_local.py +0 -0
  261. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/site_tests/__init__.py +0 -0
  262. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/site_tests/site_config_selector.py +0 -0
  263. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/site_tests/test_provider.py +0 -0
  264. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/site_tests/test_site.py +0 -0
  265. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/sites/__init__.py +0 -0
  266. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/sites/test_affinity.py +0 -0
  267. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/sites/test_concurrent.py +0 -0
  268. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/sites/test_dynamic_executor.py +0 -0
  269. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/sites/test_ec2.py +0 -0
  270. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/sites/test_launchers.py +0 -0
  271. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/sites/test_mpi/__init__.py +0 -0
  272. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/sites/test_worker_info.py +0 -0
  273. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_aalst_patterns.py +0 -0
  274. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_bash_apps/__init__.py +0 -0
  275. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
  276. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_bash_apps/test_basic.py +0 -0
  277. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
  278. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_bash_apps/test_inputs_default.py +0 -0
  279. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
  280. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -0
  281. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_bash_apps/test_memoize.py +0 -0
  282. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
  283. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
  284. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_bash_apps/test_multiline.py +0 -0
  285. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_bash_apps/test_pipeline.py +0 -0
  286. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_bash_apps/test_std_uri.py +0 -0
  287. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_bash_apps/test_stdout.py +0 -0
  288. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_callables.py +0 -0
  289. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_channels/__init__.py +0 -0
  290. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_channels/test_large_output.py +0 -0
  291. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_channels/test_local_channel.py +0 -0
  292. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_checkpointing/__init__.py +0 -0
  293. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_checkpointing/test_periodic.py +0 -0
  294. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +0 -0
  295. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
  296. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_checkpointing/test_python_checkpoint_3.py +0 -0
  297. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
  298. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_checkpointing/test_regression_233.py +0 -0
  299. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
  300. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_checkpointing/test_task_exit.py +0 -0
  301. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_curvezmq.py +0 -0
  302. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_docs/__init__.py +0 -0
  303. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_docs/test_from_slides.py +0 -0
  304. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_docs/test_kwargs.py +0 -0
  305. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
  306. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_docs/test_workflow1.py +0 -0
  307. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_docs/test_workflow2.py +0 -0
  308. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_docs/test_workflow4.py +0 -0
  309. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_error_handling/__init__.py +0 -0
  310. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_error_handling/test_fail.py +0 -0
  311. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_error_handling/test_python_walltime.py +0 -0
  312. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_error_handling/test_rand_fail.py +0 -0
  313. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_error_handling/test_resource_spec.py +0 -0
  314. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_error_handling/test_retries.py +0 -0
  315. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
  316. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
  317. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
  318. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
  319. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_flowcontrol/__init__.py +0 -0
  320. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_flux.py +0 -0
  321. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_htex/__init__.py +0 -0
  322. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_htex/test_basic.py +0 -0
  323. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_htex/test_block_manager_selector_unit.py +0 -0
  324. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_htex/test_command_client_timeout.py +0 -0
  325. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_htex/test_connected_blocks.py +0 -0
  326. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_htex/test_cpu_affinity_explicit.py +0 -0
  327. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_htex/test_disconnected_blocks.py +0 -0
  328. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_htex/test_disconnected_blocks_failing_provider.py +0 -0
  329. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_htex/test_drain.py +0 -0
  330. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_htex/test_htex.py +0 -0
  331. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_htex/test_manager_failure.py +0 -0
  332. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_htex/test_manager_selector_by_block.py +0 -0
  333. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_htex/test_managers_command.py +0 -0
  334. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_htex/test_missing_worker.py +0 -0
  335. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_htex/test_multiple_disconnected_blocks.py +0 -0
  336. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_htex/test_resource_spec_validation.py +0 -0
  337. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_htex/test_worker_failure.py +0 -0
  338. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_monitoring/__init__.py +0 -0
  339. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_monitoring/test_app_names.py +0 -0
  340. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_monitoring/test_basic.py +0 -0
  341. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
  342. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_monitoring/test_fuzz_zmq.py +0 -0
  343. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +0 -0
  344. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_monitoring/test_incomplete_futures.py +0 -0
  345. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_monitoring/test_memoization_representation.py +0 -0
  346. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_monitoring/test_stdouterr.py +0 -0
  347. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
  348. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_mpi_apps/__init__.py +0 -0
  349. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_mpi_apps/test_bad_mpi_config.py +0 -0
  350. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +0 -0
  351. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_mpi_apps/test_mpi_prefix.py +0 -0
  352. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_mpi_apps/test_mpi_scheduler.py +0 -0
  353. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_mpi_apps/test_mpiex.py +0 -0
  354. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_mpi_apps/test_resource_spec.py +0 -0
  355. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_providers/__init__.py +0 -0
  356. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_providers/test_kubernetes_provider.py +0 -0
  357. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_providers/test_local_provider.py +0 -0
  358. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_providers/test_pbspro_template.py +0 -0
  359. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_providers/test_slurm_instantiate.py +0 -0
  360. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_providers/test_slurm_template.py +0 -0
  361. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_providers/test_submiterror_deprecation.py +0 -0
  362. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_python_apps/__init__.py +0 -0
  363. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
  364. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_python_apps/test_basic.py +0 -0
  365. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_python_apps/test_context_manager.py +0 -0
  366. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_python_apps/test_dep_standard_futures.py +0 -0
  367. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
  368. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_python_apps/test_dependencies_deep.py +0 -0
  369. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_python_apps/test_depfail_propagation.py +0 -0
  370. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_python_apps/test_fail.py +0 -0
  371. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
  372. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
  373. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_python_apps/test_futures.py +0 -0
  374. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_python_apps/test_garbage_collect.py +0 -0
  375. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
  376. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_python_apps/test_inputs_default.py +0 -0
  377. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_python_apps/test_join.py +0 -0
  378. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_python_apps/test_lifted.py +0 -0
  379. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_python_apps/test_mapred.py +0 -0
  380. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
  381. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_python_apps/test_memoize_2.py +0 -0
  382. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
  383. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +0 -0
  384. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
  385. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
  386. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_python_apps/test_outputs.py +0 -0
  387. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_python_apps/test_overview.py +0 -0
  388. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_python_apps/test_pipeline.py +0 -0
  389. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_python_apps/test_pluggable_future_resolution.py +0 -0
  390. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_python_apps/test_simple.py +0 -0
  391. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_python_apps/test_timeout.py +0 -0
  392. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_python_apps/test_type5.py +0 -0
  393. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_radical/__init__.py +0 -0
  394. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_radical/test_mpi_funcs.py +0 -0
  395. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_regression/__init__.py +0 -0
  396. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_regression/test_1480.py +0 -0
  397. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +0 -0
  398. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_regression/test_1653.py +0 -0
  399. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_regression/test_221.py +0 -0
  400. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_regression/test_226.py +0 -0
  401. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_regression/test_2652.py +0 -0
  402. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_regression/test_69a.py +0 -0
  403. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_regression/test_854.py +0 -0
  404. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_regression/test_97_parallelism_0.py +0 -0
  405. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_regression/test_98.py +0 -0
  406. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_scaling/__init__.py +0 -0
  407. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_scaling/test_block_error_handler.py +0 -0
  408. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_scaling/test_regression_1621.py +0 -0
  409. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_scaling/test_regression_3568_scaledown_vs_MISSING.py +0 -0
  410. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_scaling/test_scale_down.py +0 -0
  411. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +0 -0
  412. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +0 -0
  413. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_scaling/test_shutdown_scalein.py +0 -0
  414. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_scaling/test_worker_interchange_bad_messages_3262.py +0 -0
  415. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_serialization/__init__.py +0 -0
  416. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_serialization/test_2555_caching_deserializer.py +0 -0
  417. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_serialization/test_3495_deserialize_managerlost.py +0 -0
  418. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_serialization/test_basic.py +0 -0
  419. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_serialization/test_htex_code_cache.py +0 -0
  420. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_serialization/test_pack_resource_spec.py +0 -0
  421. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_serialization/test_proxystore_configured.py +0 -0
  422. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_serialization/test_proxystore_impl.py +0 -0
  423. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_shutdown/__init__.py +0 -0
  424. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_shutdown/test_kill_monitoring.py +0 -0
  425. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_staging/__init__.py +0 -0
  426. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_staging/staging_provider.py +0 -0
  427. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_staging/test_1316.py +0 -0
  428. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_staging/test_docs_1.py +0 -0
  429. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_staging/test_docs_2.py +0 -0
  430. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
  431. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_staging/test_file.py +0 -0
  432. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_staging/test_file_apps.py +0 -0
  433. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_staging/test_file_staging.py +0 -0
  434. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_staging/test_output_chain_filenames.py +0 -0
  435. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
  436. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
  437. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_staging/test_staging_globus.py +0 -0
  438. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_staging/test_staging_https.py +0 -0
  439. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_staging/test_staging_stdout.py +0 -0
  440. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_staging/test_zip_in.py +0 -0
  441. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_staging/test_zip_out.py +0 -0
  442. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_staging/test_zip_to_zip.py +0 -0
  443. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_summary.py +0 -0
  444. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_thread_parallelism.py +0 -0
  445. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_threads/__init__.py +0 -0
  446. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_threads/test_configs.py +0 -0
  447. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
  448. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_utils/__init__.py +0 -0
  449. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_utils/test_representation_mixin.py +0 -0
  450. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/test_utils/test_sanitize_dns.py +0 -0
  451. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/unit/__init__.py +0 -0
  452. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/unit/test_file.py +0 -0
  453. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/unit/test_usage_tracking.py +0 -0
  454. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/tests/utils.py +0 -0
  455. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/usage_tracking/__init__.py +0 -0
  456. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/usage_tracking/api.py +0 -0
  457. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/usage_tracking/levels.py +0 -0
  458. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/usage_tracking/usage.py +0 -0
  459. {parsl-2024.11.18 → parsl-2024.11.25}/parsl/utils.py +0 -0
  460. {parsl-2024.11.18 → parsl-2024.11.25}/parsl.egg-info/dependency_links.txt +0 -0
  461. {parsl-2024.11.18 → parsl-2024.11.25}/parsl.egg-info/entry_points.txt +0 -0
  462. {parsl-2024.11.18 → parsl-2024.11.25}/parsl.egg-info/requires.txt +0 -0
  463. {parsl-2024.11.18 → parsl-2024.11.25}/parsl.egg-info/top_level.txt +0 -0
  464. {parsl-2024.11.18 → parsl-2024.11.25}/requirements.txt +0 -0
  465. {parsl-2024.11.18 → parsl-2024.11.25}/setup.cfg +0 -0
  466. {parsl-2024.11.18 → parsl-2024.11.25}/setup.py +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: parsl
3
- Version: 2024.11.18
3
+ Version: 2024.11.25
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.11.18.tar.gz
6
+ Download-URL: https://github.com/Parsl/parsl/archive/2024.11.25.tar.gz
7
7
  Author: The Parsl Team
8
8
  Author-email: parsl@googlegroups.com
9
9
  License: Apache 2.0
@@ -6,6 +6,7 @@ The helper to use depends on the network environment around the submitter,
6
6
  so some experimentation will probably be needed to choose the correct one.
7
7
  """
8
8
 
9
+ import ipaddress
9
10
  import logging
10
11
  import platform
11
12
  import socket
@@ -17,7 +18,7 @@ try:
17
18
  except ImportError:
18
19
  fcntl = None # type: ignore[assignment]
19
20
  import struct
20
- from typing import Callable, List, Set
21
+ from typing import Callable, List, Set, Union
21
22
 
22
23
  import psutil
23
24
  import typeguard
@@ -156,3 +157,20 @@ def get_any_address() -> str:
156
157
  if addr == '':
157
158
  raise Exception('Cannot find address of the local machine.')
158
159
  return addr
160
+
161
+
162
+ def tcp_url(address: str, port: Union[str, int, None] = None) -> str:
163
+ """Construct a tcp url safe for IPv4 and IPv6"""
164
+ if address == "*":
165
+ return "tcp://*"
166
+
167
+ ip_addr = ipaddress.ip_address(address)
168
+
169
+ port_suffix = f":{port}" if port else ""
170
+
171
+ if ip_addr.version == 6 and port_suffix:
172
+ url = f"tcp://[{address}]{port_suffix}"
173
+ else:
174
+ url = f"tcp://{address}{port_suffix}"
175
+
176
+ return url
@@ -160,6 +160,9 @@ class ServerContext(BaseContext):
160
160
  except zmq.ZMQError as e:
161
161
  raise ValueError("Invalid CurveZMQ key format") from e
162
162
  sock.setsockopt(zmq.CURVE_SERVER, True) # Must come before bind
163
+
164
+ # This flag enables IPV6 in addition to IPV4
165
+ sock.setsockopt(zmq.IPV6, True)
163
166
  return sock
164
167
 
165
168
  def term(self):
@@ -202,4 +205,5 @@ class ClientContext(BaseContext):
202
205
  sock.setsockopt(zmq.CURVE_SERVERKEY, server_public_key)
203
206
  except zmq.ZMQError as e:
204
207
  raise ValueError("Invalid CurveZMQ key format") from e
208
+ sock.setsockopt(zmq.IPV6, True)
205
209
  return sock
@@ -0,0 +1,37 @@
1
+ import os
2
+
3
+ from parsl.serialize import unpack_res_spec_apply_message
4
+
5
+
6
+ def execute_task(bufs: bytes):
7
+ """Deserialize the buffer and execute the task.
8
+ Returns the result or throws exception.
9
+ """
10
+ f, args, kwargs, resource_spec = unpack_res_spec_apply_message(bufs)
11
+
12
+ for varname in resource_spec:
13
+ envname = "PARSL_" + str(varname).upper()
14
+ os.environ[envname] = str(resource_spec[varname])
15
+
16
+ # We might need to look into callability of the function from itself
17
+ # since we change it's name in the new namespace
18
+ prefix = "parsl_"
19
+ fname = prefix + "f"
20
+ argname = prefix + "args"
21
+ kwargname = prefix + "kwargs"
22
+ resultname = prefix + "result"
23
+
24
+ code = "{0} = {1}(*{2}, **{3})".format(resultname, fname,
25
+ argname, kwargname)
26
+
27
+ user_ns = locals()
28
+ user_ns.update({
29
+ '__builtins__': __builtins__,
30
+ fname: f,
31
+ argname: args,
32
+ kwargname: kwargs,
33
+ resultname: resultname
34
+ })
35
+
36
+ exec(code, user_ns, user_ns)
37
+ return user_ns.get(resultname)
@@ -4,8 +4,8 @@ import argparse
4
4
  import logging
5
5
  import os
6
6
 
7
+ from parsl.executors.execute_task import execute_task
7
8
  from parsl.executors.flux import TaskResult
8
- from parsl.executors.high_throughput.process_worker_pool import execute_task
9
9
  from parsl.serialize import serialize
10
10
 
11
11
 
@@ -86,7 +86,7 @@ GENERAL_HTEX_PARAM_DOCS = """provider : :class:`~parsl.providers.base.ExecutionP
86
86
 
87
87
  address : string
88
88
  An address to connect to the main Parsl process which is reachable from the network in which
89
- workers will be running. This field expects an IPv4 address (xxx.xxx.xxx.xxx).
89
+ workers will be running. This field expects an IPv4 or IPv6 address.
90
90
  Most login nodes on clusters have several network interfaces available, only some of which
91
91
  can be reached from the compute nodes. This field can be used to limit the executor to listen
92
92
  only on a specific interface, and limiting connections to the internal network.
@@ -94,6 +94,11 @@ GENERAL_HTEX_PARAM_DOCS = """provider : :class:`~parsl.providers.base.ExecutionP
94
94
  Setting an address here overrides the default behavior.
95
95
  default=None
96
96
 
97
+ loopback_address: string
98
+ Specify address used for internal communication between executor and interchange.
99
+ Supports IPv4 and IPv6 addresses
100
+ default=127.0.0.1
101
+
97
102
  worker_ports : (int, int)
98
103
  Specify the ports to be used by workers to connect to Parsl. If this option is specified,
99
104
  worker_port_range will not be honored.
@@ -224,6 +229,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
224
229
  Parsl will create names as integers starting with 0.
225
230
 
226
231
  default: empty list
232
+
227
233
  """
228
234
 
229
235
  @typeguard.typechecked
@@ -233,6 +239,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
233
239
  launch_cmd: Optional[str] = None,
234
240
  interchange_launch_cmd: Optional[Sequence[str]] = None,
235
241
  address: Optional[str] = None,
242
+ loopback_address: str = "127.0.0.1",
236
243
  worker_ports: Optional[Tuple[int, int]] = None,
237
244
  worker_port_range: Optional[Tuple[int, int]] = (54000, 55000),
238
245
  interchange_port_range: Optional[Tuple[int, int]] = (55000, 56000),
@@ -268,6 +275,8 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
268
275
  self.address = address
269
276
  self.address_probe_timeout = address_probe_timeout
270
277
  self.manager_selector = manager_selector
278
+ self.loopback_address = loopback_address
279
+
271
280
  if self.address:
272
281
  self.all_addresses = address
273
282
  else:
@@ -408,13 +417,13 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
408
417
  )
409
418
 
410
419
  self.outgoing_q = zmq_pipes.TasksOutgoing(
411
- "127.0.0.1", self.interchange_port_range, self.cert_dir
420
+ self.loopback_address, self.interchange_port_range, self.cert_dir
412
421
  )
413
422
  self.incoming_q = zmq_pipes.ResultsIncoming(
414
- "127.0.0.1", self.interchange_port_range, self.cert_dir
423
+ self.loopback_address, self.interchange_port_range, self.cert_dir
415
424
  )
416
425
  self.command_client = zmq_pipes.CommandClient(
417
- "127.0.0.1", self.interchange_port_range, self.cert_dir
426
+ self.loopback_address, self.interchange_port_range, self.cert_dir
418
427
  )
419
428
 
420
429
  self._result_queue_thread = None
@@ -515,7 +524,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
515
524
  get the worker task and result ports that the interchange has bound to.
516
525
  """
517
526
 
518
- interchange_config = {"client_address": "127.0.0.1",
527
+ interchange_config = {"client_address": self.loopback_address,
519
528
  "client_ports": (self.outgoing_q.port,
520
529
  self.incoming_q.port,
521
530
  self.command_client.port),
@@ -14,6 +14,7 @@ from typing import Any, Dict, List, NoReturn, Optional, Sequence, Set, Tuple, ca
14
14
  import zmq
15
15
 
16
16
  from parsl import curvezmq
17
+ from parsl.addresses import tcp_url
17
18
  from parsl.app.errors import RemoteExceptionWrapper
18
19
  from parsl.executors.high_throughput.errors import ManagerLost, VersionMismatch
19
20
  from parsl.executors.high_throughput.manager_record import ManagerRecord
@@ -115,13 +116,13 @@ class Interchange:
115
116
  self.zmq_context = curvezmq.ServerContext(self.cert_dir)
116
117
  self.task_incoming = self.zmq_context.socket(zmq.DEALER)
117
118
  self.task_incoming.set_hwm(0)
118
- self.task_incoming.connect("tcp://{}:{}".format(client_address, client_ports[0]))
119
+ self.task_incoming.connect(tcp_url(client_address, client_ports[0]))
119
120
  self.results_outgoing = self.zmq_context.socket(zmq.DEALER)
120
121
  self.results_outgoing.set_hwm(0)
121
- self.results_outgoing.connect("tcp://{}:{}".format(client_address, client_ports[1]))
122
+ self.results_outgoing.connect(tcp_url(client_address, client_ports[1]))
122
123
 
123
124
  self.command_channel = self.zmq_context.socket(zmq.REP)
124
- self.command_channel.connect("tcp://{}:{}".format(client_address, client_ports[2]))
125
+ self.command_channel.connect(tcp_url(client_address, client_ports[2]))
125
126
  logger.info("Connected to client")
126
127
 
127
128
  self.run_id = run_id
@@ -144,14 +145,14 @@ class Interchange:
144
145
  self.worker_task_port = self.worker_ports[0]
145
146
  self.worker_result_port = self.worker_ports[1]
146
147
 
147
- self.task_outgoing.bind(f"tcp://{self.interchange_address}:{self.worker_task_port}")
148
- self.results_incoming.bind(f"tcp://{self.interchange_address}:{self.worker_result_port}")
148
+ self.task_outgoing.bind(tcp_url(self.interchange_address, self.worker_task_port))
149
+ self.results_incoming.bind(tcp_url(self.interchange_address, self.worker_result_port))
149
150
 
150
151
  else:
151
- self.worker_task_port = self.task_outgoing.bind_to_random_port(f"tcp://{self.interchange_address}",
152
+ self.worker_task_port = self.task_outgoing.bind_to_random_port(tcp_url(self.interchange_address),
152
153
  min_port=worker_port_range[0],
153
154
  max_port=worker_port_range[1], max_tries=100)
154
- self.worker_result_port = self.results_incoming.bind_to_random_port(f"tcp://{self.interchange_address}",
155
+ self.worker_result_port = self.results_incoming.bind_to_random_port(tcp_url(self.interchange_address),
155
156
  min_port=worker_port_range[0],
156
157
  max_port=worker_port_range[1], max_tries=100)
157
158
 
@@ -50,6 +50,7 @@ class MPIExecutor(HighThroughputExecutor):
50
50
  launch_cmd: Optional[str] = None,
51
51
  interchange_launch_cmd: Optional[str] = None,
52
52
  address: Optional[str] = None,
53
+ loopback_address: str = "127.0.0.1",
53
54
  worker_ports: Optional[Tuple[int, int]] = None,
54
55
  worker_port_range: Optional[Tuple[int, int]] = (54000, 55000),
55
56
  interchange_port_range: Optional[Tuple[int, int]] = (55000, 56000),
@@ -78,6 +79,7 @@ class MPIExecutor(HighThroughputExecutor):
78
79
  launch_cmd=launch_cmd,
79
80
  interchange_launch_cmd=interchange_launch_cmd,
80
81
  address=address,
82
+ loopback_address=loopback_address,
81
83
  worker_ports=worker_ports,
82
84
  worker_port_range=worker_port_range,
83
85
  interchange_port_range=interchange_port_range,
@@ -160,9 +160,7 @@ class MPITaskScheduler(TaskScheduler):
160
160
  """Schedule task if resources are available otherwise backlog the task"""
161
161
  user_ns = locals()
162
162
  user_ns.update({"__builtins__": __builtins__})
163
- _f, _args, _kwargs, resource_spec = unpack_res_spec_apply_message(
164
- task_package["buffer"], user_ns, copy=False
165
- )
163
+ _f, _args, _kwargs, resource_spec = unpack_res_spec_apply_message(task_package["buffer"])
166
164
 
167
165
  nodes_needed = resource_spec.get("num_nodes")
168
166
  if nodes_needed:
@@ -177,6 +175,7 @@ class MPITaskScheduler(TaskScheduler):
177
175
  self._map_tasks_to_nodes[task_package["task_id"]] = allocated_nodes
178
176
  buffer = pack_res_spec_apply_message(_f, _args, _kwargs, resource_spec)
179
177
  task_package["buffer"] = buffer
178
+ task_package["resource_spec"] = resource_spec
180
179
 
181
180
  self.pending_task_q.put(task_package)
182
181
 
@@ -6,7 +6,7 @@ import uuid
6
6
  import zmq
7
7
  from zmq.utils.monitor import recv_monitor_message
8
8
 
9
- from parsl.addresses import get_all_addresses
9
+ from parsl.addresses import get_all_addresses, tcp_url
10
10
 
11
11
  logger = logging.getLogger(__name__)
12
12
 
@@ -32,7 +32,8 @@ def probe_addresses(addresses, task_port, timeout=120):
32
32
  for addr in addresses:
33
33
  socket = context.socket(zmq.DEALER)
34
34
  socket.setsockopt(zmq.LINGER, 0)
35
- url = "tcp://{}:{}".format(addr, task_port)
35
+ socket.setsockopt(zmq.IPV6, True)
36
+ url = tcp_url(addr, task_port)
36
37
  logger.debug("Trying to connect back on {}".format(url))
37
38
  socket.connect(url)
38
39
  addr_map[addr] = {'sock': socket,
@@ -71,8 +72,7 @@ class TestWorker:
71
72
 
72
73
  address = probe_addresses(addresses, port)
73
74
  print("Viable address :", address)
74
- self.task_incoming.connect("tcp://{}:{}".format(address, port))
75
- print("Here")
75
+ self.task_incoming.connect(tcp_url(address, port))
76
76
 
77
77
  def heartbeat(self):
78
78
  """ Send heartbeat to the incoming task queue
@@ -22,7 +22,9 @@ import psutil
22
22
  import zmq
23
23
 
24
24
  from parsl import curvezmq
25
+ from parsl.addresses import tcp_url
25
26
  from parsl.app.errors import RemoteExceptionWrapper
27
+ from parsl.executors.execute_task import execute_task
26
28
  from parsl.executors.high_throughput.errors import WorkerLost
27
29
  from parsl.executors.high_throughput.mpi_prefix_composer import (
28
30
  VALID_LAUNCHERS,
@@ -35,7 +37,7 @@ from parsl.executors.high_throughput.mpi_resource_management import (
35
37
  from parsl.executors.high_throughput.probe import probe_addresses
36
38
  from parsl.multiprocessing import SpawnContext
37
39
  from parsl.process_loggers import wrap_with_logs
38
- from parsl.serialize import serialize, unpack_res_spec_apply_message
40
+ from parsl.serialize import serialize
39
41
  from parsl.version import VERSION as PARSL_VERSION
40
42
 
41
43
  HEARTBEAT_CODE = (2 ** 32) - 1
@@ -158,8 +160,8 @@ class Manager:
158
160
  raise Exception("No viable address found")
159
161
  else:
160
162
  logger.info("Connection to Interchange successful on {}".format(ix_address))
161
- task_q_url = "tcp://{}:{}".format(ix_address, task_port)
162
- result_q_url = "tcp://{}:{}".format(ix_address, result_port)
163
+ task_q_url = tcp_url(ix_address, task_port)
164
+ result_q_url = tcp_url(ix_address, result_port)
163
165
  logger.info("Task url : {}".format(task_q_url))
164
166
  logger.info("Result url : {}".format(result_q_url))
165
167
  except Exception:
@@ -590,45 +592,13 @@ def update_resource_spec_env_vars(mpi_launcher: str, resource_spec: Dict, node_i
590
592
  os.environ[key] = prefix_table[key]
591
593
 
592
594
 
593
- def execute_task(bufs, mpi_launcher: Optional[str] = None):
594
- """Deserialize the buffer and execute the task.
595
-
596
- Returns the result or throws exception.
597
- """
598
- user_ns = locals()
599
- user_ns.update({'__builtins__': __builtins__})
600
-
601
- f, args, kwargs, resource_spec = unpack_res_spec_apply_message(bufs, user_ns, copy=False)
602
-
603
- for varname in resource_spec:
604
- envname = "PARSL_" + str(varname).upper()
605
- os.environ[envname] = str(resource_spec[varname])
606
-
607
- if resource_spec.get("MPI_NODELIST"):
608
- worker_id = os.environ['PARSL_WORKER_RANK']
609
- nodes_for_task = resource_spec["MPI_NODELIST"].split(',')
610
- logger.info(f"Launching task on provisioned nodes: {nodes_for_task}")
611
- assert mpi_launcher
612
- update_resource_spec_env_vars(mpi_launcher,
613
- resource_spec=resource_spec,
614
- node_info=nodes_for_task)
615
- # We might need to look into callability of the function from itself
616
- # since we change it's name in the new namespace
617
- prefix = "parsl_"
618
- fname = prefix + "f"
619
- argname = prefix + "args"
620
- kwargname = prefix + "kwargs"
621
- resultname = prefix + "result"
622
-
623
- user_ns.update({fname: f,
624
- argname: args,
625
- kwargname: kwargs,
626
- resultname: resultname})
627
-
628
- code = "{0} = {1}(*{2}, **{3})".format(resultname, fname,
629
- argname, kwargname)
630
- exec(code, user_ns, user_ns)
631
- return user_ns.get(resultname)
595
+ def _init_mpi_env(mpi_launcher: str, resource_spec: Dict):
596
+ node_list = resource_spec.get("MPI_NODELIST")
597
+ if node_list is None:
598
+ return
599
+ nodes_for_task = node_list.split(',')
600
+ logger.info(f"Launching task on provisioned nodes: {nodes_for_task}")
601
+ update_resource_spec_env_vars(mpi_launcher=mpi_launcher, resource_spec=resource_spec, node_info=nodes_for_task)
632
602
 
633
603
 
634
604
  @wrap_with_logs(target="worker_log")
@@ -786,8 +756,10 @@ def worker(
786
756
  ready_worker_count.value -= 1
787
757
  worker_enqueued = False
788
758
 
759
+ _init_mpi_env(mpi_launcher=mpi_launcher, resource_spec=req["resource_spec"])
760
+
789
761
  try:
790
- result = execute_task(req['buffer'], mpi_launcher=mpi_launcher)
762
+ result = execute_task(req['buffer'])
791
763
  serialized_result = serialize(result, buffer_threshold=1000000)
792
764
  except Exception as e:
793
765
  logger.info('Caught an exception: {}'.format(e))
@@ -8,6 +8,7 @@ from typing import Optional
8
8
  import zmq
9
9
 
10
10
  from parsl import curvezmq
11
+ from parsl.addresses import tcp_url
11
12
  from parsl.errors import InternalConsistencyError
12
13
  from parsl.executors.high_throughput.errors import (
13
14
  CommandClientBadError,
@@ -52,11 +53,11 @@ class CommandClient:
52
53
  self.zmq_socket = self.zmq_context.socket(zmq.REQ)
53
54
  self.zmq_socket.setsockopt(zmq.LINGER, 0)
54
55
  if self.port is None:
55
- self.port = self.zmq_socket.bind_to_random_port("tcp://{}".format(self.ip_address),
56
+ self.port = self.zmq_socket.bind_to_random_port(tcp_url(self.ip_address),
56
57
  min_port=self.port_range[0],
57
58
  max_port=self.port_range[1])
58
59
  else:
59
- self.zmq_socket.bind("tcp://{}:{}".format(self.ip_address, self.port))
60
+ self.zmq_socket.bind(tcp_url(self.ip_address, self.port))
60
61
 
61
62
  def run(self, message, max_retries=3, timeout_s=None):
62
63
  """ This function needs to be fast at the same time aware of the possibility of
@@ -146,7 +147,7 @@ class TasksOutgoing:
146
147
  self.zmq_context = curvezmq.ClientContext(cert_dir)
147
148
  self.zmq_socket = self.zmq_context.socket(zmq.DEALER)
148
149
  self.zmq_socket.set_hwm(0)
149
- self.port = self.zmq_socket.bind_to_random_port("tcp://{}".format(ip_address),
150
+ self.port = self.zmq_socket.bind_to_random_port(tcp_url(ip_address),
150
151
  min_port=port_range[0],
151
152
  max_port=port_range[1])
152
153
  self.poller = zmq.Poller()
@@ -202,7 +203,7 @@ class ResultsIncoming:
202
203
  self.zmq_context = curvezmq.ClientContext(cert_dir)
203
204
  self.results_receiver = self.zmq_context.socket(zmq.DEALER)
204
205
  self.results_receiver.set_hwm(0)
205
- self.port = self.results_receiver.bind_to_random_port("tcp://{}".format(ip_address),
206
+ self.port = self.results_receiver.bind_to_random_port(tcp_url(ip_address),
206
207
  min_port=port_range[0],
207
208
  max_port=port_range[1])
208
209
 
@@ -4,7 +4,7 @@ import radical.pilot as rp
4
4
 
5
5
  import parsl.app.errors as pe
6
6
  from parsl.app.bash import remote_side_bash_executor
7
- from parsl.executors.high_throughput.process_worker_pool import execute_task
7
+ from parsl.executors.execute_task import execute_task
8
8
  from parsl.serialize import serialize, unpack_res_spec_apply_message
9
9
 
10
10
 
@@ -33,7 +33,7 @@ class ParslWorker:
33
33
 
34
34
  try:
35
35
  buffer = rp.utils.deserialize_bson(task['description']['executable'])
36
- func, args, kwargs, _resource_spec = unpack_res_spec_apply_message(buffer, {}, copy=False)
36
+ func, args, kwargs, _resource_spec = unpack_res_spec_apply_message(buffer)
37
37
  ret = remote_side_bash_executor(func, *args, **kwargs)
38
38
  exc = (None, None)
39
39
  val = None
@@ -94,7 +94,7 @@ def unpack_source_code_function(function_info, user_namespace):
94
94
 
95
95
  def unpack_byte_code_function(function_info, user_namespace):
96
96
  from parsl.serialize import unpack_apply_message
97
- func, args, kwargs = unpack_apply_message(function_info["byte code"], user_namespace, copy=False)
97
+ func, args, kwargs = unpack_apply_message(function_info["byte code"])
98
98
  return (func, 'parsl_function_name', args, kwargs)
99
99
 
100
100
 
@@ -87,16 +87,16 @@ def pack_res_spec_apply_message(func: Any, args: Any, kwargs: Any, resource_spec
87
87
  return pack_apply_message(func, args, (kwargs, resource_specification), buffer_threshold=buffer_threshold)
88
88
 
89
89
 
90
- def unpack_apply_message(packed_buffer: bytes, user_ns: Any = None, copy: Any = False) -> List[Any]:
90
+ def unpack_apply_message(packed_buffer: bytes) -> List[Any]:
91
91
  """ Unpack and deserialize function and parameters
92
92
  """
93
93
  return [deserialize(buf) for buf in unpack_buffers(packed_buffer)]
94
94
 
95
95
 
96
- def unpack_res_spec_apply_message(packed_buffer: bytes, user_ns: Any = None, copy: Any = False) -> List[Any]:
96
+ def unpack_res_spec_apply_message(packed_buffer: bytes) -> List[Any]:
97
97
  """ Unpack and deserialize function, parameters, and resource_specification
98
98
  """
99
- func, args, (kwargs, resource_spec) = unpack_apply_message(packed_buffer, user_ns=user_ns, copy=copy)
99
+ func, args, (kwargs, resource_spec) = unpack_apply_message(packed_buffer)
100
100
  return [func, args, kwargs, resource_spec]
101
101
 
102
102
 
@@ -10,6 +10,7 @@ def fresh_config():
10
10
  executors=[
11
11
  HighThroughputExecutor(
12
12
  label="htex_local",
13
+ loopback_address="::1",
13
14
  worker_debug=True,
14
15
  cores_per_worker=1,
15
16
  encrypted=True,
@@ -0,0 +1,29 @@
1
+ import os
2
+
3
+ import pytest
4
+
5
+ from parsl.executors.execute_task import execute_task
6
+ from parsl.serialize.facade import pack_res_spec_apply_message
7
+
8
+
9
+ def addemup(*args: int, name: str = "apples"):
10
+ total = sum(args)
11
+ return f"{total} {name}"
12
+
13
+
14
+ @pytest.mark.local
15
+ def test_execute_task():
16
+ args = (1, 2, 3)
17
+ kwargs = {"name": "boots"}
18
+ buff = pack_res_spec_apply_message(addemup, args, kwargs, {})
19
+ res = execute_task(buff)
20
+ assert res == addemup(*args, **kwargs)
21
+
22
+
23
+ @pytest.mark.local
24
+ def test_execute_task_resource_spec():
25
+ resource_spec = {"num_nodes": 2, "ranks_per_node": 2, "num_ranks": 4}
26
+ buff = pack_res_spec_apply_message(addemup, (1, 2), {}, resource_spec)
27
+ execute_task(buff)
28
+ for key, val in resource_spec.items():
29
+ assert os.environ[f"PARSL_{key.upper()}"] == str(val)
@@ -87,7 +87,7 @@ def test_interchange_binding_with_non_ipv4_address(cert_dir: Optional[str]):
87
87
  def test_interchange_binding_bad_address(cert_dir: Optional[str]):
88
88
  """Confirm that we raise a ZMQError when a bad address is supplied"""
89
89
  address = "550.0.0.0"
90
- with pytest.raises(zmq.error.ZMQError):
90
+ with pytest.raises(ValueError):
91
91
  make_interchange(interchange_address=address, cert_dir=cert_dir)
92
92
 
93
93
 
@@ -103,4 +103,5 @@ def test_limited_interface_binding(cert_dir: Optional[str]):
103
103
 
104
104
  matched_conns = [conn for conn in conns if conn.laddr.port == ix.worker_result_port]
105
105
  assert len(matched_conns) == 1
106
- assert matched_conns[0].laddr.ip == address
106
+ # laddr.ip can return ::ffff:127.0.0.1 when using IPv6
107
+ assert address in matched_conns[0].laddr.ip
@@ -0,0 +1,20 @@
1
+ import pytest
2
+
3
+ from parsl.addresses import tcp_url
4
+
5
+
6
+ @pytest.mark.local
7
+ @pytest.mark.parametrize("address, port,expected", [
8
+ ("127.0.0.1", 55001, "tcp://127.0.0.1:55001"),
9
+ ("127.0.0.1", "55001", "tcp://127.0.0.1:55001"),
10
+ ("127.0.0.1", None, "tcp://127.0.0.1"),
11
+ ("::1", "55001", "tcp://[::1]:55001"),
12
+ ("::ffff:127.0.0.1", 55001, "tcp://[::ffff:127.0.0.1]:55001"),
13
+ ("::ffff:127.0.0.1", None, "tcp://::ffff:127.0.0.1"),
14
+ ("::ffff:127.0.0.1", None, "tcp://::ffff:127.0.0.1"),
15
+ ("*", None, "tcp://*"),
16
+ ])
17
+ def test_tcp_url(address, port, expected):
18
+ """Confirm valid address generation"""
19
+ result = tcp_url(address, port)
20
+ assert result == expected
@@ -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.11.18'
6
+ VERSION = '2024.11.25'
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: parsl
3
- Version: 2024.11.18
3
+ Version: 2024.11.25
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.11.18.tar.gz
6
+ Download-URL: https://github.com/Parsl/parsl/archive/2024.11.25.tar.gz
7
7
  Author: The Parsl Team
8
8
  Author-email: parsl@googlegroups.com
9
9
  License: Apache 2.0
@@ -77,6 +77,7 @@ parsl/dataflow/taskrecord.py
77
77
  parsl/executors/__init__.py
78
78
  parsl/executors/base.py
79
79
  parsl/executors/errors.py
80
+ parsl/executors/execute_task.py
80
81
  parsl/executors/status_handling.py
81
82
  parsl/executors/threads.py
82
83
  parsl/executors/flux/__init__.py
@@ -204,6 +205,7 @@ parsl/tests/conftest.py
204
205
  parsl/tests/test_aalst_patterns.py
205
206
  parsl/tests/test_callables.py
206
207
  parsl/tests/test_curvezmq.py
208
+ parsl/tests/test_execute_task.py
207
209
  parsl/tests/test_flux.py
208
210
  parsl/tests/test_summary.py
209
211
  parsl/tests/test_thread_parallelism.py
@@ -453,6 +455,7 @@ parsl/tests/test_utils/__init__.py
453
455
  parsl/tests/test_utils/test_representation_mixin.py
454
456
  parsl/tests/test_utils/test_sanitize_dns.py
455
457
  parsl/tests/unit/__init__.py
458
+ parsl/tests/unit/test_address.py
456
459
  parsl/tests/unit/test_file.py
457
460
  parsl/tests/unit/test_usage_tracking.py
458
461
  parsl/usage_tracking/__init__.py
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes