parsl 2025.3.3__tar.gz → 2025.3.10__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 (472) hide show
  1. {parsl-2025.3.3/parsl.egg-info → parsl-2025.3.10}/PKG-INFO +2 -2
  2. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/high_throughput/executor.py +1 -1
  3. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/high_throughput/mpi_resource_management.py +13 -4
  4. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/monitoring.py +75 -79
  5. parsl-2025.3.10/parsl/monitoring/radios/filesystem_router.py +52 -0
  6. parsl-2025.3.3/parsl/monitoring/router.py → parsl-2025.3.10/parsl/monitoring/radios/udp_router.py +17 -80
  7. parsl-2025.3.10/parsl/monitoring/radios/zmq_router.py +138 -0
  8. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_mpi_apps/test_mpi_scheduler.py +25 -0
  9. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_scaling/test_shutdown_scalein.py +4 -1
  10. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_shutdown/test_kill_monitoring.py +1 -1
  11. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/version.py +1 -1
  12. {parsl-2025.3.3 → parsl-2025.3.10/parsl.egg-info}/PKG-INFO +2 -2
  13. {parsl-2025.3.3 → parsl-2025.3.10}/parsl.egg-info/SOURCES.txt +3 -1
  14. {parsl-2025.3.3 → parsl-2025.3.10}/LICENSE +0 -0
  15. {parsl-2025.3.3 → parsl-2025.3.10}/MANIFEST.in +0 -0
  16. {parsl-2025.3.3 → parsl-2025.3.10}/README.rst +0 -0
  17. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/__init__.py +0 -0
  18. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/addresses.py +0 -0
  19. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/app/__init__.py +0 -0
  20. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/app/app.py +0 -0
  21. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/app/bash.py +0 -0
  22. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/app/errors.py +0 -0
  23. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/app/futures.py +0 -0
  24. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/app/python.py +0 -0
  25. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/benchmark/__init__.py +0 -0
  26. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/benchmark/perf.py +0 -0
  27. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/concurrent/__init__.py +0 -0
  28. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/config.py +0 -0
  29. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/configs/ASPIRE1.py +0 -0
  30. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/configs/Azure.py +0 -0
  31. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/configs/__init__.py +0 -0
  32. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/configs/bridges.py +0 -0
  33. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/configs/cc_in2p3.py +0 -0
  34. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/configs/ec2.py +0 -0
  35. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/configs/expanse.py +0 -0
  36. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/configs/frontera.py +0 -0
  37. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/configs/gc_multisite.py +0 -0
  38. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/configs/gc_tutorial.py +0 -0
  39. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/configs/htex_local.py +0 -0
  40. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/configs/illinoiscluster.py +0 -0
  41. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/configs/improv.py +0 -0
  42. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/configs/kubernetes.py +0 -0
  43. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/configs/local_threads.py +0 -0
  44. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/configs/midway.py +0 -0
  45. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/configs/osg.py +0 -0
  46. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/configs/polaris.py +0 -0
  47. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/configs/stampede2.py +0 -0
  48. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/configs/summit.py +0 -0
  49. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/configs/toss3_llnl.py +0 -0
  50. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/configs/vineex_local.py +0 -0
  51. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/configs/wqex_local.py +0 -0
  52. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/curvezmq.py +0 -0
  53. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/data_provider/__init__.py +0 -0
  54. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/data_provider/data_manager.py +0 -0
  55. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/data_provider/file_noop.py +0 -0
  56. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/data_provider/files.py +0 -0
  57. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/data_provider/ftp.py +0 -0
  58. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/data_provider/globus.py +0 -0
  59. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/data_provider/http.py +0 -0
  60. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/data_provider/rsync.py +0 -0
  61. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/data_provider/staging.py +0 -0
  62. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/data_provider/zip.py +0 -0
  63. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/dataflow/__init__.py +0 -0
  64. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/dataflow/dependency_resolvers.py +0 -0
  65. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/dataflow/dflow.py +0 -0
  66. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/dataflow/errors.py +0 -0
  67. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/dataflow/futures.py +0 -0
  68. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/dataflow/memoization.py +0 -0
  69. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/dataflow/rundirs.py +0 -0
  70. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/dataflow/states.py +0 -0
  71. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/dataflow/taskrecord.py +0 -0
  72. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/errors.py +0 -0
  73. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/__init__.py +0 -0
  74. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/base.py +0 -0
  75. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/errors.py +0 -0
  76. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/execute_task.py +0 -0
  77. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/flux/__init__.py +0 -0
  78. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/flux/execute_parsl_task.py +0 -0
  79. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/flux/executor.py +0 -0
  80. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/flux/flux_instance_manager.py +0 -0
  81. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/globus_compute.py +0 -0
  82. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/high_throughput/__init__.py +0 -0
  83. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/high_throughput/errors.py +0 -0
  84. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/high_throughput/interchange.py +0 -0
  85. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/high_throughput/manager_record.py +0 -0
  86. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/high_throughput/manager_selector.py +0 -0
  87. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/high_throughput/monitoring_info.py +0 -0
  88. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/high_throughput/mpi_executor.py +0 -0
  89. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/high_throughput/mpi_prefix_composer.py +0 -0
  90. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/high_throughput/probe.py +0 -0
  91. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/high_throughput/process_worker_pool.py +0 -0
  92. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/high_throughput/zmq_pipes.py +0 -0
  93. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/radical/__init__.py +0 -0
  94. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/radical/executor.py +0 -0
  95. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/radical/rpex_resources.py +0 -0
  96. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/radical/rpex_worker.py +0 -0
  97. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/status_handling.py +0 -0
  98. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/taskvine/__init__.py +0 -0
  99. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/taskvine/errors.py +0 -0
  100. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/taskvine/exec_parsl_function.py +0 -0
  101. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/taskvine/executor.py +0 -0
  102. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/taskvine/factory.py +0 -0
  103. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/taskvine/factory_config.py +0 -0
  104. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/taskvine/manager.py +0 -0
  105. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/taskvine/manager_config.py +0 -0
  106. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/taskvine/utils.py +0 -0
  107. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/threads.py +0 -0
  108. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/workqueue/__init__.py +0 -0
  109. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/workqueue/errors.py +0 -0
  110. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/workqueue/exec_parsl_function.py +0 -0
  111. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/workqueue/executor.py +0 -0
  112. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/workqueue/parsl_coprocess.py +0 -0
  113. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
  114. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/jobs/__init__.py +0 -0
  115. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/jobs/error_handlers.py +0 -0
  116. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/jobs/errors.py +0 -0
  117. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/jobs/job_status_poller.py +0 -0
  118. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/jobs/states.py +0 -0
  119. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/jobs/strategy.py +0 -0
  120. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/launchers/__init__.py +0 -0
  121. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/launchers/base.py +0 -0
  122. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/launchers/errors.py +0 -0
  123. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/launchers/launchers.py +0 -0
  124. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/log_utils.py +0 -0
  125. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/__init__.py +0 -0
  126. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/db_manager.py +0 -0
  127. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/errors.py +0 -0
  128. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/message_type.py +0 -0
  129. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/queries/__init__.py +0 -0
  130. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/queries/pandas.py +0 -0
  131. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/radios/__init__.py +0 -0
  132. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/radios/base.py +0 -0
  133. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/radios/filesystem.py +0 -0
  134. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/radios/htex.py +0 -0
  135. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/radios/multiprocessing.py +0 -0
  136. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/radios/udp.py +0 -0
  137. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/radios/zmq.py +0 -0
  138. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/remote.py +0 -0
  139. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/types.py +0 -0
  140. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/visualization/__init__.py +0 -0
  141. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/visualization/app.py +0 -0
  142. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/visualization/models.py +0 -0
  143. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/visualization/plots/__init__.py +0 -0
  144. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
  145. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
  146. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/visualization/plots/default/workflow_plots.py +0 -0
  147. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +0 -0
  148. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
  149. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
  150. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/visualization/templates/app.html +0 -0
  151. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/visualization/templates/dag.html +0 -0
  152. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/visualization/templates/error.html +0 -0
  153. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/visualization/templates/layout.html +0 -0
  154. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
  155. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/visualization/templates/task.html +0 -0
  156. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/visualization/templates/workflow.html +0 -0
  157. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
  158. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/visualization/utils.py +0 -0
  159. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/visualization/version.py +0 -0
  160. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/monitoring/visualization/views.py +0 -0
  161. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/multiprocessing.py +0 -0
  162. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/process_loggers.py +0 -0
  163. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/providers/__init__.py +0 -0
  164. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/providers/aws/__init__.py +0 -0
  165. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/providers/aws/aws.py +0 -0
  166. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/providers/aws/template.py +0 -0
  167. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/providers/azure/__init__.py +0 -0
  168. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/providers/azure/azure.py +0 -0
  169. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/providers/azure/template.py +0 -0
  170. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/providers/base.py +0 -0
  171. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/providers/cluster_provider.py +0 -0
  172. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/providers/condor/__init__.py +0 -0
  173. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/providers/condor/condor.py +0 -0
  174. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/providers/condor/template.py +0 -0
  175. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/providers/errors.py +0 -0
  176. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/providers/googlecloud/__init__.py +0 -0
  177. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/providers/googlecloud/googlecloud.py +0 -0
  178. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/providers/grid_engine/__init__.py +0 -0
  179. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/providers/grid_engine/grid_engine.py +0 -0
  180. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/providers/grid_engine/template.py +0 -0
  181. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/providers/kubernetes/__init__.py +0 -0
  182. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/providers/kubernetes/kube.py +0 -0
  183. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/providers/kubernetes/template.py +0 -0
  184. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/providers/local/__init__.py +0 -0
  185. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/providers/local/local.py +0 -0
  186. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/providers/lsf/__init__.py +0 -0
  187. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/providers/lsf/lsf.py +0 -0
  188. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/providers/lsf/template.py +0 -0
  189. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/providers/pbspro/__init__.py +0 -0
  190. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/providers/pbspro/pbspro.py +0 -0
  191. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/providers/pbspro/template.py +0 -0
  192. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/providers/slurm/__init__.py +0 -0
  193. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/providers/slurm/slurm.py +0 -0
  194. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/providers/slurm/template.py +0 -0
  195. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/providers/torque/__init__.py +0 -0
  196. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/providers/torque/template.py +0 -0
  197. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/providers/torque/torque.py +0 -0
  198. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/py.typed +0 -0
  199. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/serialize/__init__.py +0 -0
  200. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/serialize/base.py +0 -0
  201. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/serialize/concretes.py +0 -0
  202. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/serialize/errors.py +0 -0
  203. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/serialize/facade.py +0 -0
  204. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/serialize/proxystore.py +0 -0
  205. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/__init__.py +0 -0
  206. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/callables_helper.py +0 -0
  207. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/configs/__init__.py +0 -0
  208. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/configs/azure_single_node.py +0 -0
  209. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/configs/bluewaters.py +0 -0
  210. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/configs/bridges.py +0 -0
  211. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/configs/cc_in2p3.py +0 -0
  212. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/configs/comet.py +0 -0
  213. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/configs/ec2_single_node.py +0 -0
  214. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/configs/ec2_spot.py +0 -0
  215. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/configs/flux_local.py +0 -0
  216. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/configs/frontera.py +0 -0
  217. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/configs/globus_compute.py +0 -0
  218. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/configs/htex_local.py +0 -0
  219. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/configs/htex_local_alternate.py +0 -0
  220. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/configs/htex_local_intask_staging.py +0 -0
  221. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/configs/htex_local_rsync_staging.py +0 -0
  222. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/configs/local_radical.py +0 -0
  223. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/configs/local_radical_mpi.py +0 -0
  224. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/configs/local_threads.py +0 -0
  225. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
  226. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
  227. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/configs/local_threads_checkpoint_periodic.py +0 -0
  228. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
  229. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
  230. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/configs/local_threads_globus.py +0 -0
  231. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
  232. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/configs/local_threads_monitoring.py +0 -0
  233. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/configs/local_threads_no_cache.py +0 -0
  234. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/configs/midway.py +0 -0
  235. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/configs/nscc_singapore.py +0 -0
  236. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/configs/osg_htex.py +0 -0
  237. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/configs/petrelkube.py +0 -0
  238. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/configs/slurm_local.py +0 -0
  239. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/configs/summit.py +0 -0
  240. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/configs/taskvine_ex.py +0 -0
  241. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/configs/user_opts.py +0 -0
  242. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/configs/workqueue_ex.py +0 -0
  243. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/conftest.py +0 -0
  244. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/integration/__init__.py +0 -0
  245. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/integration/latency.py +0 -0
  246. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/integration/test_apps/__init__.py +0 -0
  247. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
  248. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/integration/test_stress/__init__.py +0 -0
  249. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
  250. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
  251. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/manual_tests/__init__.py +0 -0
  252. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/manual_tests/htex_local.py +0 -0
  253. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/manual_tests/test_basic.py +0 -0
  254. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/manual_tests/test_log_filter.py +0 -0
  255. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/manual_tests/test_memory_limits.py +0 -0
  256. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/manual_tests/test_regression_220.py +0 -0
  257. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/manual_tests/test_udp_simple.py +0 -0
  258. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/manual_tests/test_worker_count.py +0 -0
  259. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/scaling_tests/__init__.py +0 -0
  260. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/scaling_tests/htex_local.py +0 -0
  261. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/scaling_tests/local_threads.py +0 -0
  262. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/scaling_tests/test_scale.py +0 -0
  263. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/scaling_tests/vineex_condor.py +0 -0
  264. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/scaling_tests/vineex_local.py +0 -0
  265. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/scaling_tests/wqex_condor.py +0 -0
  266. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/scaling_tests/wqex_local.py +0 -0
  267. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/site_tests/__init__.py +0 -0
  268. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/site_tests/site_config_selector.py +0 -0
  269. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/site_tests/test_provider.py +0 -0
  270. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/site_tests/test_site.py +0 -0
  271. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/sites/__init__.py +0 -0
  272. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/sites/test_affinity.py +0 -0
  273. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/sites/test_concurrent.py +0 -0
  274. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/sites/test_dynamic_executor.py +0 -0
  275. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/sites/test_ec2.py +0 -0
  276. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/sites/test_launchers.py +0 -0
  277. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/sites/test_mpi/__init__.py +0 -0
  278. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/sites/test_worker_info.py +0 -0
  279. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_aalst_patterns.py +0 -0
  280. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_bash_apps/__init__.py +0 -0
  281. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
  282. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_bash_apps/test_basic.py +0 -0
  283. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
  284. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_bash_apps/test_inputs_default.py +0 -0
  285. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
  286. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -0
  287. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_bash_apps/test_memoize.py +0 -0
  288. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
  289. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
  290. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_bash_apps/test_multiline.py +0 -0
  291. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_bash_apps/test_pipeline.py +0 -0
  292. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_bash_apps/test_std_uri.py +0 -0
  293. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_bash_apps/test_stdout.py +0 -0
  294. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_callables.py +0 -0
  295. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_checkpointing/__init__.py +0 -0
  296. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_checkpointing/test_periodic.py +0 -0
  297. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +0 -0
  298. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
  299. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
  300. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_checkpointing/test_regression_233.py +0 -0
  301. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
  302. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_checkpointing/test_task_exit.py +0 -0
  303. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_curvezmq.py +0 -0
  304. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_docs/__init__.py +0 -0
  305. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_docs/test_from_slides.py +0 -0
  306. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_docs/test_kwargs.py +0 -0
  307. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
  308. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_docs/test_workflow1.py +0 -0
  309. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_docs/test_workflow2.py +0 -0
  310. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_docs/test_workflow4.py +0 -0
  311. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_error_handling/__init__.py +0 -0
  312. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_error_handling/test_fail.py +0 -0
  313. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_error_handling/test_python_walltime.py +0 -0
  314. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_error_handling/test_rand_fail.py +0 -0
  315. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_error_handling/test_resource_spec.py +0 -0
  316. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_error_handling/test_retries.py +0 -0
  317. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
  318. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
  319. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
  320. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
  321. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_execute_task.py +0 -0
  322. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_flowcontrol/__init__.py +0 -0
  323. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_flux.py +0 -0
  324. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_htex/__init__.py +0 -0
  325. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_htex/test_basic.py +0 -0
  326. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_htex/test_block_manager_selector_unit.py +0 -0
  327. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_htex/test_command_client_timeout.py +0 -0
  328. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_htex/test_connected_blocks.py +0 -0
  329. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_htex/test_cpu_affinity_explicit.py +0 -0
  330. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_htex/test_disconnected_blocks.py +0 -0
  331. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_htex/test_disconnected_blocks_failing_provider.py +0 -0
  332. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_htex/test_drain.py +0 -0
  333. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_htex/test_htex.py +0 -0
  334. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_htex/test_interchange_exit_bad_registration.py +0 -0
  335. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_htex/test_manager_failure.py +0 -0
  336. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_htex/test_manager_selector_by_block.py +0 -0
  337. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_htex/test_managers_command.py +0 -0
  338. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_htex/test_missing_worker.py +0 -0
  339. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_htex/test_multiple_disconnected_blocks.py +0 -0
  340. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_htex/test_resource_spec_validation.py +0 -0
  341. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_htex/test_worker_failure.py +0 -0
  342. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_htex/test_zmq_binding.py +0 -0
  343. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_monitoring/__init__.py +0 -0
  344. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_monitoring/test_app_names.py +0 -0
  345. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_monitoring/test_basic.py +0 -0
  346. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
  347. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_monitoring/test_fuzz_zmq.py +0 -0
  348. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +0 -0
  349. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_monitoring/test_incomplete_futures.py +0 -0
  350. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_monitoring/test_memoization_representation.py +0 -0
  351. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_monitoring/test_stdouterr.py +0 -0
  352. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
  353. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_mpi_apps/__init__.py +0 -0
  354. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_mpi_apps/test_bad_mpi_config.py +0 -0
  355. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +0 -0
  356. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_mpi_apps/test_mpi_prefix.py +0 -0
  357. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_mpi_apps/test_mpiex.py +0 -0
  358. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_mpi_apps/test_resource_spec.py +0 -0
  359. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_providers/__init__.py +0 -0
  360. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_providers/test_kubernetes_provider.py +0 -0
  361. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_providers/test_local_provider.py +0 -0
  362. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_providers/test_pbspro_template.py +0 -0
  363. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_providers/test_slurm_instantiate.py +0 -0
  364. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_providers/test_slurm_template.py +0 -0
  365. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_providers/test_submiterror_deprecation.py +0 -0
  366. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_python_apps/__init__.py +0 -0
  367. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
  368. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_python_apps/test_basic.py +0 -0
  369. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_python_apps/test_context_manager.py +0 -0
  370. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_python_apps/test_dep_standard_futures.py +0 -0
  371. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
  372. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_python_apps/test_dependencies_deep.py +0 -0
  373. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_python_apps/test_depfail_propagation.py +0 -0
  374. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_python_apps/test_fail.py +0 -0
  375. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
  376. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
  377. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_python_apps/test_futures.py +0 -0
  378. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_python_apps/test_garbage_collect.py +0 -0
  379. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
  380. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_python_apps/test_inputs_default.py +0 -0
  381. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_python_apps/test_join.py +0 -0
  382. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_python_apps/test_lifted.py +0 -0
  383. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_python_apps/test_mapred.py +0 -0
  384. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
  385. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_python_apps/test_memoize_2.py +0 -0
  386. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
  387. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +0 -0
  388. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
  389. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
  390. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_python_apps/test_outputs.py +0 -0
  391. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_python_apps/test_overview.py +0 -0
  392. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_python_apps/test_pipeline.py +0 -0
  393. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_python_apps/test_pluggable_future_resolution.py +0 -0
  394. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_python_apps/test_simple.py +0 -0
  395. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_python_apps/test_timeout.py +0 -0
  396. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_python_apps/test_type5.py +0 -0
  397. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_radical/__init__.py +0 -0
  398. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_radical/test_mpi_funcs.py +0 -0
  399. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_regression/__init__.py +0 -0
  400. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_regression/test_1480.py +0 -0
  401. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +0 -0
  402. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_regression/test_1653.py +0 -0
  403. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_regression/test_221.py +0 -0
  404. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_regression/test_226.py +0 -0
  405. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_regression/test_2652.py +0 -0
  406. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_regression/test_69a.py +0 -0
  407. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_regression/test_854.py +0 -0
  408. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_regression/test_97_parallelism_0.py +0 -0
  409. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_regression/test_98.py +0 -0
  410. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_scaling/__init__.py +0 -0
  411. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_scaling/test_block_error_handler.py +0 -0
  412. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_scaling/test_regression_1621.py +0 -0
  413. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_scaling/test_regression_3568_scaledown_vs_MISSING.py +0 -0
  414. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_scaling/test_regression_3696_oscillation.py +0 -0
  415. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_scaling/test_scale_down.py +0 -0
  416. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +0 -0
  417. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +0 -0
  418. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_scaling/test_worker_interchange_bad_messages_3262.py +0 -0
  419. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_serialization/__init__.py +0 -0
  420. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_serialization/test_2555_caching_deserializer.py +0 -0
  421. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_serialization/test_3495_deserialize_managerlost.py +0 -0
  422. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_serialization/test_basic.py +0 -0
  423. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_serialization/test_htex_code_cache.py +0 -0
  424. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_serialization/test_pack_resource_spec.py +0 -0
  425. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_serialization/test_proxystore_configured.py +0 -0
  426. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_serialization/test_proxystore_impl.py +0 -0
  427. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_shutdown/__init__.py +0 -0
  428. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_staging/__init__.py +0 -0
  429. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_staging/staging_provider.py +0 -0
  430. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_staging/test_1316.py +0 -0
  431. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_staging/test_docs_1.py +0 -0
  432. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_staging/test_docs_2.py +0 -0
  433. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
  434. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_staging/test_file.py +0 -0
  435. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_staging/test_file_apps.py +0 -0
  436. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_staging/test_file_staging.py +0 -0
  437. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_staging/test_output_chain_filenames.py +0 -0
  438. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
  439. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
  440. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_staging/test_staging_globus.py +0 -0
  441. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_staging/test_staging_https.py +0 -0
  442. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_staging/test_staging_stdout.py +0 -0
  443. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_staging/test_zip_in.py +0 -0
  444. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_staging/test_zip_out.py +0 -0
  445. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_staging/test_zip_to_zip.py +0 -0
  446. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_summary.py +0 -0
  447. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_thread_parallelism.py +0 -0
  448. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_threads/__init__.py +0 -0
  449. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_threads/test_configs.py +0 -0
  450. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
  451. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_utils/__init__.py +0 -0
  452. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_utils/test_execute_wait.py +0 -0
  453. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_utils/test_representation_mixin.py +0 -0
  454. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/test_utils/test_sanitize_dns.py +0 -0
  455. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/unit/__init__.py +0 -0
  456. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/unit/test_address.py +0 -0
  457. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/unit/test_file.py +0 -0
  458. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/unit/test_globus_compute_executor.py +0 -0
  459. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/unit/test_usage_tracking.py +0 -0
  460. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/tests/utils.py +0 -0
  461. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/usage_tracking/__init__.py +0 -0
  462. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/usage_tracking/api.py +0 -0
  463. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/usage_tracking/levels.py +0 -0
  464. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/usage_tracking/usage.py +0 -0
  465. {parsl-2025.3.3 → parsl-2025.3.10}/parsl/utils.py +0 -0
  466. {parsl-2025.3.3 → parsl-2025.3.10}/parsl.egg-info/dependency_links.txt +0 -0
  467. {parsl-2025.3.3 → parsl-2025.3.10}/parsl.egg-info/entry_points.txt +0 -0
  468. {parsl-2025.3.3 → parsl-2025.3.10}/parsl.egg-info/requires.txt +0 -0
  469. {parsl-2025.3.3 → parsl-2025.3.10}/parsl.egg-info/top_level.txt +0 -0
  470. {parsl-2025.3.3 → parsl-2025.3.10}/requirements.txt +0 -0
  471. {parsl-2025.3.3 → parsl-2025.3.10}/setup.cfg +0 -0
  472. {parsl-2025.3.3 → parsl-2025.3.10}/setup.py +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: parsl
3
- Version: 2025.3.3
3
+ Version: 2025.3.10
4
4
  Summary: Simple data dependent workflows in Python
5
5
  Home-page: https://github.com/Parsl/parsl
6
- Download-URL: https://github.com/Parsl/parsl/archive/2025.03.03.tar.gz
6
+ Download-URL: https://github.com/Parsl/parsl/archive/2025.03.10.tar.gz
7
7
  Author: The Parsl Team
8
8
  Author-email: parsl@googlegroups.com
9
9
  License: Apache 2.0
@@ -536,7 +536,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
536
536
  "interchange_address": self.address,
537
537
  "worker_ports": self.worker_ports,
538
538
  "worker_port_range": self.worker_port_range,
539
- "hub_address": self.hub_address,
539
+ "hub_address": self.loopback_address,
540
540
  "hub_zmq_port": self.hub_zmq_port,
541
541
  "logdir": self.logdir,
542
542
  "heartbeat_threshold": self.heartbeat_threshold,
@@ -4,6 +4,7 @@ import os
4
4
  import pickle
5
5
  import queue
6
6
  import subprocess
7
+ from dataclasses import dataclass, field
7
8
  from enum import Enum
8
9
  from typing import Dict, List, Optional
9
10
 
@@ -69,6 +70,14 @@ class MPINodesUnavailable(Exception):
69
70
  return f"MPINodesUnavailable(requested={self.requested} available={self.available})"
70
71
 
71
72
 
73
+ @dataclass(order=True)
74
+ class PrioritizedTask:
75
+ # Comparing dict will fail since they are unhashable
76
+ # This dataclass limits comparison to the priority field
77
+ priority: int
78
+ task: Dict = field(compare=False)
79
+
80
+
72
81
  class TaskScheduler:
73
82
  """Default TaskScheduler that does no taskscheduling
74
83
 
@@ -111,7 +120,7 @@ class MPITaskScheduler(TaskScheduler):
111
120
  super().__init__(pending_task_q, pending_result_q)
112
121
  self.scheduler = identify_scheduler()
113
122
  # PriorityQueue is threadsafe
114
- self._backlog_queue: queue.PriorityQueue = queue.PriorityQueue()
123
+ self._backlog_queue: queue.PriorityQueue[PrioritizedTask] = queue.PriorityQueue()
115
124
  self._map_tasks_to_nodes: Dict[str, List[str]] = {}
116
125
  self.available_nodes = get_nodes_in_batchjob(self.scheduler)
117
126
  self._free_node_counter = SpawnContext.Value("i", len(self.available_nodes))
@@ -169,7 +178,7 @@ class MPITaskScheduler(TaskScheduler):
169
178
  allocated_nodes = self._get_nodes(nodes_needed)
170
179
  except MPINodesUnavailable:
171
180
  logger.info(f"Not enough resources, placing task {tid} into backlog")
172
- self._backlog_queue.put((nodes_needed, task_package))
181
+ self._backlog_queue.put(PrioritizedTask(nodes_needed, task_package))
173
182
  return
174
183
  else:
175
184
  resource_spec["MPI_NODELIST"] = ",".join(allocated_nodes)
@@ -183,8 +192,8 @@ class MPITaskScheduler(TaskScheduler):
183
192
  def _schedule_backlog_tasks(self):
184
193
  """Attempt to schedule backlogged tasks"""
185
194
  try:
186
- _nodes_requested, task_package = self._backlog_queue.get(block=False)
187
- self.put_task(task_package)
195
+ prioritized_task = self._backlog_queue.get(block=False)
196
+ self.put_task(prioritized_task.task)
188
197
  except queue.Empty:
189
198
  return
190
199
  else:
@@ -3,23 +3,21 @@ from __future__ import annotations
3
3
  import logging
4
4
  import multiprocessing.synchronize as ms
5
5
  import os
6
- import pickle
7
6
  import queue
8
- import time
9
7
  from multiprocessing import Event
10
8
  from multiprocessing.queues import Queue
11
- from typing import TYPE_CHECKING, Literal, Optional, Tuple, Union, cast
9
+ from typing import TYPE_CHECKING, Literal, Optional, Tuple, Union
12
10
 
13
11
  import typeguard
14
12
 
15
- from parsl.log_utils import set_file_logger
16
13
  from parsl.monitoring.errors import MonitoringHubStartError
14
+ from parsl.monitoring.radios.filesystem_router import filesystem_router_starter
17
15
  from parsl.monitoring.radios.multiprocessing import MultiprocessingQueueRadioSender
18
- from parsl.monitoring.router import router_starter
16
+ from parsl.monitoring.radios.udp_router import udp_router_starter
17
+ from parsl.monitoring.radios.zmq_router import zmq_router_starter
19
18
  from parsl.monitoring.types import TaggedMonitoringMessage
20
19
  from parsl.multiprocessing import ForkProcess, SizedQueue
21
- from parsl.process_loggers import wrap_with_logs
22
- from parsl.utils import RepresentationMixin, setproctitle
20
+ from parsl.utils import RepresentationMixin
23
21
 
24
22
  _db_manager_excepts: Optional[Exception]
25
23
 
@@ -121,11 +119,14 @@ class MonitoringHub(RepresentationMixin):
121
119
  # in the future, Queue will allow runtime subscripts.
122
120
 
123
121
  if TYPE_CHECKING:
124
- comm_q: Queue[Union[Tuple[int, int], str]]
122
+ zmq_comm_q: Queue[Union[int, str]]
123
+ udp_comm_q: Queue[Union[int, str]]
125
124
  else:
126
- comm_q: Queue
125
+ zmq_comm_q: Queue
126
+ udp_comm_q: Queue
127
127
 
128
- comm_q = SizedQueue(maxsize=10)
128
+ zmq_comm_q = SizedQueue(maxsize=10)
129
+ udp_comm_q = SizedQueue(maxsize=10)
129
130
 
130
131
  self.exception_q: Queue[Tuple[str, str]]
131
132
  self.exception_q = SizedQueue(maxsize=10)
@@ -136,21 +137,35 @@ class MonitoringHub(RepresentationMixin):
136
137
  self.router_exit_event: ms.Event
137
138
  self.router_exit_event = Event()
138
139
 
139
- self.router_proc = ForkProcess(target=router_starter,
140
- kwargs={"comm_q": comm_q,
141
- "exception_q": self.exception_q,
142
- "resource_msgs": self.resource_msgs,
143
- "exit_event": self.router_exit_event,
144
- "hub_address": self.hub_address,
145
- "udp_port": self.hub_port,
146
- "zmq_port_range": self.hub_port_range,
147
- "run_dir": dfk_run_dir,
148
- "logging_level": logging.DEBUG if self.monitoring_debug else logging.INFO,
149
- },
150
- name="Monitoring-Router-Process",
151
- daemon=True,
152
- )
153
- self.router_proc.start()
140
+ self.zmq_router_proc = ForkProcess(target=zmq_router_starter,
141
+ kwargs={"comm_q": zmq_comm_q,
142
+ "exception_q": self.exception_q,
143
+ "resource_msgs": self.resource_msgs,
144
+ "exit_event": self.router_exit_event,
145
+ "hub_address": self.hub_address,
146
+ "zmq_port_range": self.hub_port_range,
147
+ "run_dir": dfk_run_dir,
148
+ "logging_level": logging.DEBUG if self.monitoring_debug else logging.INFO,
149
+ },
150
+ name="Monitoring-ZMQ-Router-Process",
151
+ daemon=True,
152
+ )
153
+ self.zmq_router_proc.start()
154
+
155
+ self.udp_router_proc = ForkProcess(target=udp_router_starter,
156
+ kwargs={"comm_q": udp_comm_q,
157
+ "exception_q": self.exception_q,
158
+ "resource_msgs": self.resource_msgs,
159
+ "exit_event": self.router_exit_event,
160
+ "hub_address": self.hub_address,
161
+ "udp_port": self.hub_port,
162
+ "run_dir": dfk_run_dir,
163
+ "logging_level": logging.DEBUG if self.monitoring_debug else logging.INFO,
164
+ },
165
+ name="Monitoring-UDP-Router-Process",
166
+ daemon=True,
167
+ )
168
+ self.udp_router_proc.start()
154
169
 
155
170
  self.dbm_proc = ForkProcess(target=dbm_starter,
156
171
  args=(self.exception_q, self.resource_msgs,),
@@ -162,9 +177,10 @@ class MonitoringHub(RepresentationMixin):
162
177
  daemon=True,
163
178
  )
164
179
  self.dbm_proc.start()
165
- logger.info("Started the router process %s and DBM process %s", self.router_proc.pid, self.dbm_proc.pid)
180
+ logger.info("Started ZMQ router process %s, UDP router process %s and DBM process %s",
181
+ self.zmq_router_proc.pid, self.udp_router_proc.pid, self.dbm_proc.pid)
166
182
 
167
- self.filesystem_proc = ForkProcess(target=filesystem_receiver,
183
+ self.filesystem_proc = ForkProcess(target=filesystem_router_starter,
168
184
  args=(self.resource_msgs, dfk_run_dir),
169
185
  name="Monitoring-Filesystem-Process",
170
186
  daemon=True
@@ -175,25 +191,36 @@ class MonitoringHub(RepresentationMixin):
175
191
  self.radio = MultiprocessingQueueRadioSender(self.resource_msgs)
176
192
 
177
193
  try:
178
- comm_q_result = comm_q.get(block=True, timeout=120)
179
- comm_q.close()
180
- comm_q.join_thread()
194
+ zmq_comm_q_result = zmq_comm_q.get(block=True, timeout=120)
195
+ zmq_comm_q.close()
196
+ zmq_comm_q.join_thread()
181
197
  except queue.Empty:
182
- logger.error("Hub has not completed initialization in 120s. Aborting")
198
+ logger.error("Monitoring ZMQ Router has not reported port in 120s. Aborting")
183
199
  raise MonitoringHubStartError()
184
200
 
185
- if isinstance(comm_q_result, str):
186
- logger.error("MonitoringRouter sent an error message: %s", comm_q_result)
187
- raise RuntimeError(f"MonitoringRouter failed to start: {comm_q_result}")
201
+ if isinstance(zmq_comm_q_result, str):
202
+ logger.error("MonitoringRouter sent an error message: %s", zmq_comm_q_result)
203
+ raise RuntimeError(f"MonitoringRouter failed to start: {zmq_comm_q_result}")
204
+
205
+ self.hub_zmq_port = zmq_comm_q_result
206
+
207
+ try:
208
+ udp_comm_q_result = udp_comm_q.get(block=True, timeout=120)
209
+ udp_comm_q.close()
210
+ udp_comm_q.join_thread()
211
+ except queue.Empty:
212
+ logger.error("Monitoring UDP router has not reported port in 120s. Aborting")
213
+ raise MonitoringHubStartError()
188
214
 
189
- udp_port, zmq_port = comm_q_result
215
+ if isinstance(udp_comm_q_result, str):
216
+ logger.error("MonitoringRouter sent an error message: %s", udp_comm_q_result)
217
+ raise RuntimeError(f"MonitoringRouter failed to start: {udp_comm_q_result}")
190
218
 
219
+ udp_port = udp_comm_q_result
191
220
  self.monitoring_hub_url = "udp://{}:{}".format(self.hub_address, udp_port)
192
221
 
193
222
  logger.info("Monitoring Hub initialized")
194
223
 
195
- self.hub_zmq_port = zmq_port
196
-
197
224
  def send(self, message: TaggedMonitoringMessage) -> None:
198
225
  logger.debug("Sending message type %s", message[0])
199
226
  self.radio.send(message)
@@ -216,14 +243,21 @@ class MonitoringHub(RepresentationMixin):
216
243
  exception_msg[0],
217
244
  exception_msg[1]
218
245
  )
219
- self.router_proc.terminate()
246
+ self.zmq_router_proc.terminate()
247
+ self.udp_router_proc.terminate()
220
248
  self.dbm_proc.terminate()
221
249
  self.filesystem_proc.terminate()
222
250
  logger.info("Setting router termination event")
223
251
  self.router_exit_event.set()
224
- logger.info("Waiting for router to terminate")
225
- self.router_proc.join()
226
- self.router_proc.close()
252
+
253
+ logger.info("Waiting for ZMQ router to terminate")
254
+ self.zmq_router_proc.join()
255
+ self.zmq_router_proc.close()
256
+
257
+ logger.info("Waiting for UDP router to terminate")
258
+ self.udp_router_proc.join()
259
+ self.udp_router_proc.close()
260
+
227
261
  logger.debug("Finished waiting for router termination")
228
262
  if len(exception_msgs) == 0:
229
263
  logger.debug("Sending STOP to DBM")
@@ -248,41 +282,3 @@ class MonitoringHub(RepresentationMixin):
248
282
  self.resource_msgs.close()
249
283
  self.resource_msgs.join_thread()
250
284
  logger.info("Closed monitoring multiprocessing queues")
251
-
252
-
253
- @wrap_with_logs
254
- def filesystem_receiver(q: Queue[TaggedMonitoringMessage], run_dir: str) -> None:
255
- logger = set_file_logger(f"{run_dir}/monitoring_filesystem_radio.log",
256
- name="monitoring_filesystem_radio",
257
- level=logging.INFO)
258
-
259
- logger.info("Starting filesystem radio receiver")
260
- setproctitle("parsl: monitoring filesystem receiver")
261
- base_path = f"{run_dir}/monitor-fs-radio/"
262
- tmp_dir = f"{base_path}/tmp/"
263
- new_dir = f"{base_path}/new/"
264
- logger.debug("Creating new and tmp paths under %s", base_path)
265
-
266
- target_radio = MultiprocessingQueueRadioSender(q)
267
-
268
- os.makedirs(tmp_dir, exist_ok=True)
269
- os.makedirs(new_dir, exist_ok=True)
270
-
271
- while True: # this loop will end on process termination
272
- logger.debug("Start filesystem radio receiver loop")
273
-
274
- # iterate over files in new_dir
275
- for filename in os.listdir(new_dir):
276
- try:
277
- logger.info("Processing filesystem radio file %s", filename)
278
- full_path_filename = f"{new_dir}/{filename}"
279
- with open(full_path_filename, "rb") as f:
280
- message = pickle.load(f)
281
- logger.debug("Message received is: %s", message)
282
- assert isinstance(message, tuple)
283
- target_radio.send(cast(TaggedMonitoringMessage, message))
284
- os.remove(full_path_filename)
285
- except Exception:
286
- logger.exception("Exception processing %s - probably will be retried next iteration", filename)
287
-
288
- time.sleep(1) # whats a good time for this poll?
@@ -0,0 +1,52 @@
1
+ from __future__ import annotations
2
+
3
+ import logging
4
+ import os
5
+ import pickle
6
+ import time
7
+ from multiprocessing.queues import Queue
8
+ from typing import cast
9
+
10
+ from parsl.log_utils import set_file_logger
11
+ from parsl.monitoring.radios.multiprocessing import MultiprocessingQueueRadioSender
12
+ from parsl.monitoring.types import TaggedMonitoringMessage
13
+ from parsl.process_loggers import wrap_with_logs
14
+ from parsl.utils import setproctitle
15
+
16
+
17
+ @wrap_with_logs
18
+ def filesystem_router_starter(q: Queue[TaggedMonitoringMessage], run_dir: str) -> None:
19
+ logger = set_file_logger(f"{run_dir}/monitoring_filesystem_radio.log",
20
+ name="monitoring_filesystem_radio",
21
+ level=logging.INFO)
22
+
23
+ logger.info("Starting filesystem radio receiver")
24
+ setproctitle("parsl: monitoring filesystem receiver")
25
+ base_path = f"{run_dir}/monitor-fs-radio/"
26
+ tmp_dir = f"{base_path}/tmp/"
27
+ new_dir = f"{base_path}/new/"
28
+ logger.debug("Creating new and tmp paths under %s", base_path)
29
+
30
+ target_radio = MultiprocessingQueueRadioSender(q)
31
+
32
+ os.makedirs(tmp_dir, exist_ok=True)
33
+ os.makedirs(new_dir, exist_ok=True)
34
+
35
+ while True: # this loop will end on process termination
36
+ logger.debug("Start filesystem radio receiver loop")
37
+
38
+ # iterate over files in new_dir
39
+ for filename in os.listdir(new_dir):
40
+ try:
41
+ logger.info("Processing filesystem radio file %s", filename)
42
+ full_path_filename = f"{new_dir}/{filename}"
43
+ with open(full_path_filename, "rb") as f:
44
+ message = pickle.load(f)
45
+ logger.debug("Message received is: %s", message)
46
+ assert isinstance(message, tuple)
47
+ target_radio.send(cast(TaggedMonitoringMessage, message))
48
+ os.remove(full_path_filename)
49
+ except Exception:
50
+ logger.exception("Exception processing %s - probably will be retried next iteration", filename)
51
+
52
+ time.sleep(1) # whats a good time for this poll?
@@ -5,17 +5,14 @@ import multiprocessing.queues as mpq
5
5
  import os
6
6
  import pickle
7
7
  import socket
8
- import threading
9
8
  import time
10
9
  from multiprocessing.synchronize import Event
11
- from typing import Optional, Tuple
10
+ from typing import Optional
12
11
 
13
12
  import typeguard
14
- import zmq
15
13
 
16
14
  from parsl.log_utils import set_file_logger
17
15
  from parsl.monitoring.radios.multiprocessing import MultiprocessingQueueRadioSender
18
- from parsl.monitoring.types import TaggedMonitoringMessage
19
16
  from parsl.process_loggers import wrap_with_logs
20
17
  from parsl.utils import setproctitle
21
18
 
@@ -28,7 +25,6 @@ class MonitoringRouter:
28
25
  *,
29
26
  hub_address: str,
30
27
  udp_port: Optional[int] = None,
31
- zmq_port_range: Tuple[int, int] = (55050, 56000),
32
28
 
33
29
  monitoring_hub_address: str = "127.0.0.1",
34
30
  run_dir: str = ".",
@@ -45,9 +41,6 @@ class MonitoringRouter:
45
41
  The ip address at which the workers will be able to reach the Hub.
46
42
  udp_port : int
47
43
  The specific port at which workers will be able to reach the Hub via UDP. Default: None
48
- zmq_port_range : tuple(int, int)
49
- The MonitoringHub picks ports at random from the range which will be used by Hub.
50
- Default: (55050, 56000)
51
44
  run_dir : str
52
45
  Parsl log directory paths. Logs and temp files go here. Default: '.'
53
46
  logging_level : int
@@ -60,7 +53,7 @@ class MonitoringRouter:
60
53
  An event that the main Parsl process will set to signal that the monitoring router should shut down.
61
54
  """
62
55
  os.makedirs(run_dir, exist_ok=True)
63
- self.logger = set_file_logger(f"{run_dir}/monitoring_router.log",
56
+ self.logger = set_file_logger(f"{run_dir}/monitoring_udp_router.log",
64
57
  name="monitoring_router",
65
58
  level=logging_level)
66
59
  self.logger.debug("Monitoring router starting")
@@ -88,37 +81,12 @@ class MonitoringRouter:
88
81
  self.udp_sock.settimeout(self.loop_freq / 1000)
89
82
  self.logger.info("Initialized the UDP socket on 0.0.0.0:{}".format(self.udp_port))
90
83
 
91
- self._context = zmq.Context()
92
- self.zmq_receiver_channel = self._context.socket(zmq.DEALER)
93
- self.zmq_receiver_channel.setsockopt(zmq.LINGER, 0)
94
- self.zmq_receiver_channel.set_hwm(0)
95
- self.zmq_receiver_channel.RCVTIMEO = int(self.loop_freq) # in milliseconds
96
- self.logger.debug("hub_address: {}. zmq_port_range {}".format(hub_address, zmq_port_range))
97
- self.zmq_receiver_port = self.zmq_receiver_channel.bind_to_random_port("tcp://*",
98
- min_port=zmq_port_range[0],
99
- max_port=zmq_port_range[1])
100
-
101
84
  self.target_radio = MultiprocessingQueueRadioSender(resource_msgs)
102
85
  self.exit_event = exit_event
103
86
 
104
87
  @wrap_with_logs(target="monitoring_router")
105
88
  def start(self) -> None:
106
- self.logger.info("Starting UDP listener thread")
107
- udp_radio_receiver_thread = threading.Thread(target=self.start_udp_listener, daemon=True)
108
- udp_radio_receiver_thread.start()
109
-
110
- self.logger.info("Starting ZMQ listener thread")
111
- zmq_radio_receiver_thread = threading.Thread(target=self.start_zmq_listener, daemon=True)
112
- zmq_radio_receiver_thread.start()
113
-
114
- self.logger.info("Joining on ZMQ listener thread")
115
- zmq_radio_receiver_thread.join()
116
- self.logger.info("Joining on UDP listener thread")
117
- udp_radio_receiver_thread.join()
118
- self.logger.info("Joined on both ZMQ and UDP listener threads")
119
-
120
- @wrap_with_logs(target="monitoring_router")
121
- def start_udp_listener(self) -> None:
89
+ self.logger.info("Starting UDP listener")
122
90
  try:
123
91
  while not self.exit_event.is_set():
124
92
  try:
@@ -145,55 +113,24 @@ class MonitoringRouter:
145
113
  finally:
146
114
  self.logger.info("UDP listener finished")
147
115
 
148
- @wrap_with_logs(target="monitoring_router")
149
- def start_zmq_listener(self) -> None:
150
- try:
151
- while not self.exit_event.is_set():
152
- try:
153
- dfk_loop_start = time.time()
154
- while time.time() - dfk_loop_start < 1.0: # TODO make configurable
155
- # note that nothing checks that msg really is of the annotated type
156
- msg: TaggedMonitoringMessage
157
- msg = self.zmq_receiver_channel.recv_pyobj()
158
-
159
- assert isinstance(msg, tuple), "ZMQ Receiver expects only tuples, got {}".format(msg)
160
- assert len(msg) >= 1, "ZMQ Receiver expects tuples of length at least 1, got {}".format(msg)
161
- assert len(msg) == 2, "ZMQ Receiver expects message tuples of exactly length 2, got {}".format(msg)
162
-
163
- self.target_radio.send(msg)
164
- except zmq.Again:
165
- pass
166
- except Exception:
167
- # This will catch malformed messages. What happens if the
168
- # channel is broken in such a way that it always raises
169
- # an exception? Looping on this would maybe be the wrong
170
- # thing to do.
171
- self.logger.warning("Failure processing a ZMQ message", exc_info=True)
172
-
173
- self.logger.info("ZMQ listener finishing normally")
174
- finally:
175
- self.logger.info("ZMQ listener finished")
176
-
177
116
 
178
117
  @wrap_with_logs
179
118
  @typeguard.typechecked
180
- def router_starter(*,
181
- comm_q: mpq.Queue,
182
- exception_q: mpq.Queue,
183
- resource_msgs: mpq.Queue,
184
- exit_event: Event,
185
-
186
- hub_address: str,
187
- udp_port: Optional[int],
188
- zmq_port_range: Tuple[int, int],
189
-
190
- run_dir: str,
191
- logging_level: int) -> None:
192
- setproctitle("parsl: monitoring router")
119
+ def udp_router_starter(*,
120
+ comm_q: mpq.Queue,
121
+ exception_q: mpq.Queue,
122
+ resource_msgs: mpq.Queue,
123
+ exit_event: Event,
124
+
125
+ hub_address: str,
126
+ udp_port: Optional[int],
127
+
128
+ run_dir: str,
129
+ logging_level: int) -> None:
130
+ setproctitle("parsl: monitoring UDP router")
193
131
  try:
194
132
  router = MonitoringRouter(hub_address=hub_address,
195
133
  udp_port=udp_port,
196
- zmq_port_range=zmq_port_range,
197
134
  run_dir=run_dir,
198
135
  logging_level=logging_level,
199
136
  resource_msgs=resource_msgs,
@@ -202,11 +139,11 @@ def router_starter(*,
202
139
  logger.error("MonitoringRouter construction failed.", exc_info=True)
203
140
  comm_q.put(f"Monitoring router construction failed: {e}")
204
141
  else:
205
- comm_q.put((router.udp_port, router.zmq_receiver_port))
142
+ comm_q.put(router.udp_port)
206
143
 
207
144
  router.logger.info("Starting MonitoringRouter in router_starter")
208
145
  try:
209
146
  router.start()
210
147
  except Exception as e:
211
- router.logger.exception("router.start exception")
148
+ router.logger.exception("UDP router start exception")
212
149
  exception_q.put(('Hub', str(e)))
@@ -0,0 +1,138 @@
1
+ from __future__ import annotations
2
+
3
+ import logging
4
+ import multiprocessing.queues as mpq
5
+ import os
6
+ import time
7
+ from multiprocessing.synchronize import Event
8
+ from typing import Tuple
9
+
10
+ import typeguard
11
+ import zmq
12
+
13
+ from parsl.log_utils import set_file_logger
14
+ from parsl.monitoring.radios.multiprocessing import MultiprocessingQueueRadioSender
15
+ from parsl.monitoring.types import TaggedMonitoringMessage
16
+ from parsl.process_loggers import wrap_with_logs
17
+ from parsl.utils import setproctitle
18
+
19
+ logger = logging.getLogger(__name__)
20
+
21
+
22
+ class MonitoringRouter:
23
+
24
+ def __init__(self,
25
+ *,
26
+ hub_address: str,
27
+ zmq_port_range: Tuple[int, int] = (55050, 56000),
28
+
29
+ run_dir: str = ".",
30
+ logging_level: int = logging.INFO,
31
+ resource_msgs: mpq.Queue,
32
+ exit_event: Event,
33
+ ):
34
+ """ Initializes a monitoring configuration class.
35
+
36
+ Parameters
37
+ ----------
38
+ hub_address : str
39
+ The ip address at which the workers will be able to reach the Hub.
40
+ zmq_port_range : tuple(int, int)
41
+ The MonitoringHub picks ports at random from the range which will be used by Hub.
42
+ Default: (55050, 56000)
43
+ run_dir : str
44
+ Parsl log directory paths. Logs and temp files go here. Default: '.'
45
+ logging_level : int
46
+ Logging level as defined in the logging module. Default: logging.INFO
47
+ resource_msgs : multiprocessing.Queue
48
+ A multiprocessing queue to receive messages to be routed onwards to the database process
49
+ exit_event : Event
50
+ An event that the main Parsl process will set to signal that the monitoring router should shut down.
51
+ """
52
+ os.makedirs(run_dir, exist_ok=True)
53
+ self.logger = set_file_logger(f"{run_dir}/monitoring_zmq_router.log",
54
+ name="monitoring_router",
55
+ level=logging_level)
56
+ self.logger.debug("Monitoring router starting")
57
+
58
+ self.hub_address = hub_address
59
+
60
+ self.loop_freq = 10.0 # milliseconds
61
+
62
+ self._context = zmq.Context()
63
+ self.zmq_receiver_channel = self._context.socket(zmq.DEALER)
64
+ self.zmq_receiver_channel.setsockopt(zmq.LINGER, 0)
65
+ self.zmq_receiver_channel.set_hwm(0)
66
+ self.zmq_receiver_channel.RCVTIMEO = int(self.loop_freq) # in milliseconds
67
+ self.logger.debug("hub_address: {}. zmq_port_range {}".format(hub_address, zmq_port_range))
68
+ self.zmq_receiver_port = self.zmq_receiver_channel.bind_to_random_port("tcp://*",
69
+ min_port=zmq_port_range[0],
70
+ max_port=zmq_port_range[1])
71
+
72
+ self.target_radio = MultiprocessingQueueRadioSender(resource_msgs)
73
+ self.exit_event = exit_event
74
+
75
+ @wrap_with_logs(target="monitoring_router")
76
+ def start(self) -> None:
77
+ self.logger.info("Starting ZMQ listener")
78
+ try:
79
+ while not self.exit_event.is_set():
80
+ try:
81
+ dfk_loop_start = time.time()
82
+ while time.time() - dfk_loop_start < 1.0: # TODO make configurable
83
+ # note that nothing checks that msg really is of the annotated type
84
+ msg: TaggedMonitoringMessage
85
+ msg = self.zmq_receiver_channel.recv_pyobj()
86
+
87
+ assert isinstance(msg, tuple), "ZMQ Receiver expects only tuples, got {}".format(msg)
88
+ assert len(msg) >= 1, "ZMQ Receiver expects tuples of length at least 1, got {}".format(msg)
89
+ assert len(msg) == 2, "ZMQ Receiver expects message tuples of exactly length 2, got {}".format(msg)
90
+
91
+ self.target_radio.send(msg)
92
+ except zmq.Again:
93
+ pass
94
+ except Exception:
95
+ # This will catch malformed messages. What happens if the
96
+ # channel is broken in such a way that it always raises
97
+ # an exception? Looping on this would maybe be the wrong
98
+ # thing to do.
99
+ self.logger.warning("Failure processing a ZMQ message", exc_info=True)
100
+
101
+ self.logger.info("ZMQ listener finishing normally")
102
+ finally:
103
+ self.logger.info("ZMQ listener finished")
104
+
105
+
106
+ @wrap_with_logs
107
+ @typeguard.typechecked
108
+ def zmq_router_starter(*,
109
+ comm_q: mpq.Queue,
110
+ exception_q: mpq.Queue,
111
+ resource_msgs: mpq.Queue,
112
+ exit_event: Event,
113
+
114
+ hub_address: str,
115
+ zmq_port_range: Tuple[int, int],
116
+
117
+ run_dir: str,
118
+ logging_level: int) -> None:
119
+ setproctitle("parsl: monitoring zmq router")
120
+ try:
121
+ router = MonitoringRouter(hub_address=hub_address,
122
+ zmq_port_range=zmq_port_range,
123
+ run_dir=run_dir,
124
+ logging_level=logging_level,
125
+ resource_msgs=resource_msgs,
126
+ exit_event=exit_event)
127
+ except Exception as e:
128
+ logger.error("MonitoringRouter construction failed.", exc_info=True)
129
+ comm_q.put(f"Monitoring router construction failed: {e}")
130
+ else:
131
+ comm_q.put(router.zmq_receiver_port)
132
+
133
+ router.logger.info("Starting MonitoringRouter in router_starter")
134
+ try:
135
+ router.start()
136
+ except Exception as e:
137
+ router.logger.exception("ZMQ router start exception")
138
+ exception_q.put(('Hub', str(e)))