parsl 2025.9.8__tar.gz → 2025.9.22__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.

Potentially problematic release.


This version of parsl might be problematic. Click here for more details.

Files changed (475) hide show
  1. {parsl-2025.9.8/parsl.egg-info → parsl-2025.9.22}/PKG-INFO +2 -2
  2. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/curvezmq.py +0 -16
  3. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/execute_task.py +2 -8
  4. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/flux/executor.py +3 -5
  5. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/high_throughput/executor.py +10 -4
  6. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/high_throughput/interchange.py +14 -4
  7. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/high_throughput/mpi_resource_management.py +1 -7
  8. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/high_throughput/process_worker_pool.py +5 -1
  9. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/high_throughput/zmq_pipes.py +29 -43
  10. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/radical/executor.py +2 -6
  11. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/radical/rpex_worker.py +2 -2
  12. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/monitoring.py +2 -2
  13. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/multiprocessing.py +0 -49
  14. parsl-2025.9.22/parsl/serialize/__init__.py +13 -0
  15. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/serialize/facade.py +0 -32
  16. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_curvezmq.py +0 -42
  17. parsl-2025.9.22/parsl/tests/test_execute_task.py +20 -0
  18. parsl-2025.9.22/parsl/tests/test_htex/test_command_concurrency_regression_1321.py +54 -0
  19. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_interchange_exit_bad_registration.py +2 -1
  20. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_priority_queue.py +8 -2
  21. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_zmq_binding.py +2 -1
  22. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_mpi_apps/test_mpi_scheduler.py +18 -43
  23. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/version.py +1 -1
  24. {parsl-2025.9.8 → parsl-2025.9.22/parsl.egg-info}/PKG-INFO +2 -2
  25. {parsl-2025.9.8 → parsl-2025.9.22}/parsl.egg-info/SOURCES.txt +1 -7
  26. parsl-2025.9.8/parsl/serialize/__init__.py +0 -16
  27. parsl-2025.9.8/parsl/tests/site_tests/test_provider.py +0 -88
  28. parsl-2025.9.8/parsl/tests/site_tests/test_site.py +0 -70
  29. parsl-2025.9.8/parsl/tests/test_aalst_patterns.py +0 -474
  30. parsl-2025.9.8/parsl/tests/test_docs/test_workflow2.py +0 -42
  31. parsl-2025.9.8/parsl/tests/test_error_handling/test_rand_fail.py +0 -171
  32. parsl-2025.9.8/parsl/tests/test_execute_task.py +0 -29
  33. parsl-2025.9.8/parsl/tests/test_regression/test_854.py +0 -62
  34. parsl-2025.9.8/parsl/tests/test_serialization/test_pack_resource_spec.py +0 -23
  35. {parsl-2025.9.8 → parsl-2025.9.22}/LICENSE +0 -0
  36. {parsl-2025.9.8 → parsl-2025.9.22}/MANIFEST.in +0 -0
  37. {parsl-2025.9.8 → parsl-2025.9.22}/README.rst +0 -0
  38. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/__init__.py +0 -0
  39. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/addresses.py +0 -0
  40. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/app/__init__.py +0 -0
  41. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/app/app.py +0 -0
  42. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/app/bash.py +0 -0
  43. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/app/errors.py +0 -0
  44. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/app/futures.py +0 -0
  45. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/app/python.py +0 -0
  46. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/benchmark/__init__.py +0 -0
  47. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/benchmark/perf.py +0 -0
  48. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/concurrent/__init__.py +0 -0
  49. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/config.py +0 -0
  50. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/ASPIRE1.py +0 -0
  51. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/Azure.py +0 -0
  52. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/__init__.py +0 -0
  53. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/anvil.py +0 -0
  54. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/bridges.py +0 -0
  55. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/cc_in2p3.py +0 -0
  56. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/delta.py +0 -0
  57. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/ec2.py +0 -0
  58. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/expanse.py +0 -0
  59. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/frontera.py +0 -0
  60. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/gc_multisite.py +0 -0
  61. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/gc_tutorial.py +0 -0
  62. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/htex_local.py +0 -0
  63. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/illinoiscluster.py +0 -0
  64. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/improv.py +0 -0
  65. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/kubernetes.py +0 -0
  66. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/local_threads.py +0 -0
  67. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/midway.py +0 -0
  68. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/osg.py +0 -0
  69. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/polaris.py +0 -0
  70. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/stampede2.py +0 -0
  71. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/summit.py +0 -0
  72. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/toss3_llnl.py +0 -0
  73. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/vineex_local.py +0 -0
  74. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/configs/wqex_local.py +0 -0
  75. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/data_provider/__init__.py +0 -0
  76. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/data_provider/data_manager.py +0 -0
  77. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/data_provider/file_noop.py +0 -0
  78. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/data_provider/files.py +0 -0
  79. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/data_provider/ftp.py +0 -0
  80. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/data_provider/globus.py +0 -0
  81. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/data_provider/http.py +0 -0
  82. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/data_provider/rsync.py +0 -0
  83. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/data_provider/staging.py +0 -0
  84. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/data_provider/zip.py +0 -0
  85. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/dataflow/__init__.py +0 -0
  86. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/dataflow/dependency_resolvers.py +0 -0
  87. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/dataflow/dflow.py +0 -0
  88. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/dataflow/errors.py +0 -0
  89. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/dataflow/futures.py +0 -0
  90. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/dataflow/memoization.py +0 -0
  91. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/dataflow/rundirs.py +0 -0
  92. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/dataflow/states.py +0 -0
  93. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/dataflow/taskrecord.py +0 -0
  94. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/errors.py +0 -0
  95. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/__init__.py +0 -0
  96. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/base.py +0 -0
  97. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/errors.py +0 -0
  98. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/flux/__init__.py +0 -0
  99. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/flux/execute_parsl_task.py +0 -0
  100. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/flux/flux_instance_manager.py +0 -0
  101. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/globus_compute.py +0 -0
  102. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/high_throughput/__init__.py +0 -0
  103. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/high_throughput/errors.py +0 -0
  104. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/high_throughput/manager_record.py +0 -0
  105. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/high_throughput/manager_selector.py +0 -0
  106. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/high_throughput/monitoring_info.py +0 -0
  107. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/high_throughput/mpi_executor.py +0 -0
  108. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/high_throughput/mpi_prefix_composer.py +0 -0
  109. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/high_throughput/probe.py +0 -0
  110. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/radical/__init__.py +0 -0
  111. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/radical/rpex_resources.py +0 -0
  112. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/status_handling.py +0 -0
  113. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/taskvine/__init__.py +0 -0
  114. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/taskvine/errors.py +0 -0
  115. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/taskvine/exec_parsl_function.py +0 -0
  116. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/taskvine/executor.py +0 -0
  117. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/taskvine/factory.py +0 -0
  118. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/taskvine/factory_config.py +0 -0
  119. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/taskvine/manager.py +0 -0
  120. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/taskvine/manager_config.py +0 -0
  121. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/taskvine/utils.py +0 -0
  122. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/threads.py +0 -0
  123. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/workqueue/__init__.py +0 -0
  124. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/workqueue/errors.py +0 -0
  125. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/workqueue/exec_parsl_function.py +0 -0
  126. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/workqueue/executor.py +0 -0
  127. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/workqueue/parsl_coprocess.py +0 -0
  128. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
  129. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/jobs/__init__.py +0 -0
  130. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/jobs/error_handlers.py +0 -0
  131. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/jobs/errors.py +0 -0
  132. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/jobs/job_status_poller.py +0 -0
  133. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/jobs/states.py +0 -0
  134. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/jobs/strategy.py +0 -0
  135. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/launchers/__init__.py +0 -0
  136. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/launchers/base.py +0 -0
  137. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/launchers/errors.py +0 -0
  138. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/launchers/launchers.py +0 -0
  139. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/log_utils.py +0 -0
  140. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/__init__.py +0 -0
  141. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/db_manager.py +0 -0
  142. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/errors.py +0 -0
  143. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/message_type.py +0 -0
  144. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/queries/__init__.py +0 -0
  145. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/queries/pandas.py +0 -0
  146. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/radios/__init__.py +0 -0
  147. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/radios/base.py +0 -0
  148. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/radios/filesystem.py +0 -0
  149. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/radios/filesystem_router.py +0 -0
  150. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/radios/htex.py +0 -0
  151. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/radios/multiprocessing.py +0 -0
  152. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/radios/udp.py +0 -0
  153. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/radios/udp_router.py +0 -0
  154. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/radios/zmq.py +0 -0
  155. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/radios/zmq_router.py +0 -0
  156. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/remote.py +0 -0
  157. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/types.py +0 -0
  158. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/__init__.py +0 -0
  159. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/app.py +0 -0
  160. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/models.py +0 -0
  161. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/plots/__init__.py +0 -0
  162. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
  163. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
  164. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/plots/default/workflow_plots.py +0 -0
  165. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +0 -0
  166. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
  167. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
  168. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/templates/app.html +0 -0
  169. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/templates/dag.html +0 -0
  170. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/templates/error.html +0 -0
  171. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/templates/layout.html +0 -0
  172. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
  173. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/templates/task.html +0 -0
  174. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/templates/workflow.html +0 -0
  175. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
  176. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/utils.py +0 -0
  177. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/version.py +0 -0
  178. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/monitoring/visualization/views.py +0 -0
  179. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/process_loggers.py +0 -0
  180. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/__init__.py +0 -0
  181. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/aws/__init__.py +0 -0
  182. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/aws/aws.py +0 -0
  183. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/aws/template.py +0 -0
  184. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/azure/__init__.py +0 -0
  185. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/azure/azure.py +0 -0
  186. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/azure/template.py +0 -0
  187. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/base.py +0 -0
  188. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/cluster_provider.py +0 -0
  189. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/condor/__init__.py +0 -0
  190. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/condor/condor.py +0 -0
  191. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/condor/template.py +0 -0
  192. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/errors.py +0 -0
  193. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/googlecloud/__init__.py +0 -0
  194. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/googlecloud/googlecloud.py +0 -0
  195. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/grid_engine/__init__.py +0 -0
  196. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/grid_engine/grid_engine.py +0 -0
  197. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/grid_engine/template.py +0 -0
  198. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/kubernetes/__init__.py +0 -0
  199. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/kubernetes/kube.py +0 -0
  200. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/kubernetes/template.py +0 -0
  201. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/local/__init__.py +0 -0
  202. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/local/local.py +0 -0
  203. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/lsf/__init__.py +0 -0
  204. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/lsf/lsf.py +0 -0
  205. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/lsf/template.py +0 -0
  206. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/pbspro/__init__.py +0 -0
  207. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/pbspro/pbspro.py +0 -0
  208. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/pbspro/template.py +0 -0
  209. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/slurm/__init__.py +0 -0
  210. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/slurm/slurm.py +0 -0
  211. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/slurm/template.py +0 -0
  212. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/torque/__init__.py +0 -0
  213. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/torque/template.py +0 -0
  214. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/providers/torque/torque.py +0 -0
  215. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/py.typed +0 -0
  216. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/serialize/base.py +0 -0
  217. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/serialize/concretes.py +0 -0
  218. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/serialize/errors.py +0 -0
  219. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/serialize/proxystore.py +0 -0
  220. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/__init__.py +0 -0
  221. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/callables_helper.py +0 -0
  222. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/__init__.py +0 -0
  223. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/azure_single_node.py +0 -0
  224. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/bluewaters.py +0 -0
  225. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/bridges.py +0 -0
  226. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/cc_in2p3.py +0 -0
  227. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/comet.py +0 -0
  228. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/ec2_single_node.py +0 -0
  229. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/ec2_spot.py +0 -0
  230. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/flux_local.py +0 -0
  231. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/frontera.py +0 -0
  232. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/globus_compute.py +0 -0
  233. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/htex_local.py +0 -0
  234. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/htex_local_alternate.py +0 -0
  235. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/htex_local_intask_staging.py +0 -0
  236. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/htex_local_rsync_staging.py +0 -0
  237. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/local_radical.py +0 -0
  238. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/local_radical_mpi.py +0 -0
  239. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/local_threads.py +0 -0
  240. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
  241. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
  242. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/local_threads_checkpoint_periodic.py +0 -0
  243. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
  244. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
  245. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/local_threads_globus.py +0 -0
  246. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
  247. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/local_threads_no_cache.py +0 -0
  248. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/midway.py +0 -0
  249. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/nscc_singapore.py +0 -0
  250. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/osg_htex.py +0 -0
  251. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/petrelkube.py +0 -0
  252. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/slurm_local.py +0 -0
  253. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/summit.py +0 -0
  254. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/taskvine_ex.py +0 -0
  255. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/user_opts.py +0 -0
  256. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/configs/workqueue_ex.py +0 -0
  257. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/conftest.py +0 -0
  258. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/integration/__init__.py +0 -0
  259. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/integration/latency.py +0 -0
  260. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/integration/test_apps/__init__.py +0 -0
  261. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
  262. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/integration/test_stress/__init__.py +0 -0
  263. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
  264. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
  265. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/manual_tests/__init__.py +0 -0
  266. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/manual_tests/htex_local.py +0 -0
  267. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/manual_tests/test_basic.py +0 -0
  268. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/manual_tests/test_log_filter.py +0 -0
  269. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/manual_tests/test_memory_limits.py +0 -0
  270. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/manual_tests/test_regression_220.py +0 -0
  271. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/manual_tests/test_worker_count.py +0 -0
  272. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/site_tests/__init__.py +0 -0
  273. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/site_tests/site_config_selector.py +0 -0
  274. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/sites/__init__.py +0 -0
  275. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/sites/test_affinity.py +0 -0
  276. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/sites/test_concurrent.py +0 -0
  277. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/sites/test_dynamic_executor.py +0 -0
  278. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/sites/test_ec2.py +0 -0
  279. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/sites/test_launchers.py +0 -0
  280. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/sites/test_mpi/__init__.py +0 -0
  281. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/sites/test_worker_info.py +0 -0
  282. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_bash_apps/__init__.py +0 -0
  283. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
  284. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_bash_apps/test_basic.py +0 -0
  285. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
  286. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_bash_apps/test_inputs_default.py +0 -0
  287. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
  288. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -0
  289. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_bash_apps/test_memoize.py +0 -0
  290. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
  291. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
  292. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_bash_apps/test_multiline.py +0 -0
  293. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_bash_apps/test_pipeline.py +0 -0
  294. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_bash_apps/test_std_uri.py +0 -0
  295. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_bash_apps/test_stdout.py +0 -0
  296. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_callables.py +0 -0
  297. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_checkpointing/__init__.py +0 -0
  298. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_checkpointing/test_periodic.py +0 -0
  299. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +0 -0
  300. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
  301. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
  302. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_checkpointing/test_regression_233.py +0 -0
  303. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
  304. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_checkpointing/test_task_exit.py +0 -0
  305. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_docs/__init__.py +0 -0
  306. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_docs/test_from_slides.py +0 -0
  307. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_docs/test_kwargs.py +0 -0
  308. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
  309. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_docs/test_workflow1.py +0 -0
  310. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_docs/test_workflow4.py +0 -0
  311. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_error_handling/__init__.py +0 -0
  312. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_error_handling/test_fail.py +0 -0
  313. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_error_handling/test_python_walltime.py +0 -0
  314. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_error_handling/test_resource_spec.py +0 -0
  315. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_error_handling/test_retries.py +0 -0
  316. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
  317. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
  318. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
  319. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
  320. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_flowcontrol/__init__.py +0 -0
  321. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_flux.py +0 -0
  322. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/__init__.py +0 -0
  323. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_basic.py +0 -0
  324. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_block_manager_selector_unit.py +0 -0
  325. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_command_client_timeout.py +0 -0
  326. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_connected_blocks.py +0 -0
  327. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_cpu_affinity_explicit.py +0 -0
  328. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_disconnected_blocks.py +0 -0
  329. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_disconnected_blocks_failing_provider.py +0 -0
  330. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_drain.py +0 -0
  331. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_htex.py +0 -0
  332. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_manager_failure.py +0 -0
  333. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_manager_selector_by_block.py +0 -0
  334. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_managers_command.py +0 -0
  335. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_missing_worker.py +0 -0
  336. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_multiple_disconnected_blocks.py +0 -0
  337. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_resource_spec_validation.py +0 -0
  338. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_htex/test_worker_failure.py +0 -0
  339. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_monitoring/__init__.py +0 -0
  340. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_monitoring/test_app_names.py +0 -0
  341. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_monitoring/test_basic.py +0 -0
  342. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
  343. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_monitoring/test_exit_helper.py +0 -0
  344. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_monitoring/test_htex_fuzz_zmq.py +0 -0
  345. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +0 -0
  346. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_monitoring/test_incomplete_futures.py +0 -0
  347. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_monitoring/test_memoization_representation.py +0 -0
  348. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_monitoring/test_radio_filesystem.py +0 -0
  349. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_monitoring/test_radio_multiprocessing.py +0 -0
  350. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_monitoring/test_radio_udp.py +0 -0
  351. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_monitoring/test_radio_zmq.py +0 -0
  352. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_monitoring/test_stdouterr.py +0 -0
  353. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
  354. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_mpi_apps/__init__.py +0 -0
  355. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_mpi_apps/test_bad_mpi_config.py +0 -0
  356. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +0 -0
  357. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_mpi_apps/test_mpi_prefix.py +0 -0
  358. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_mpi_apps/test_mpiex.py +0 -0
  359. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_mpi_apps/test_resource_spec.py +0 -0
  360. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_providers/__init__.py +0 -0
  361. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_providers/test_kubernetes_provider.py +0 -0
  362. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_providers/test_local_provider.py +0 -0
  363. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_providers/test_pbspro_template.py +0 -0
  364. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_providers/test_slurm_instantiate.py +0 -0
  365. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_providers/test_slurm_template.py +0 -0
  366. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_providers/test_submiterror_deprecation.py +0 -0
  367. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/__init__.py +0 -0
  368. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
  369. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_basic.py +0 -0
  370. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_context_manager.py +0 -0
  371. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_dep_standard_futures.py +0 -0
  372. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
  373. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_dependencies_deep.py +0 -0
  374. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_depfail_propagation.py +0 -0
  375. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_fail.py +0 -0
  376. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
  377. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
  378. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_futures.py +0 -0
  379. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_garbage_collect.py +0 -0
  380. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
  381. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_inputs_default.py +0 -0
  382. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_join.py +0 -0
  383. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_lifted.py +0 -0
  384. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_mapred.py +0 -0
  385. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
  386. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_memoize_2.py +0 -0
  387. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
  388. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +0 -0
  389. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_memoize_exception.py +0 -0
  390. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
  391. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
  392. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_outputs.py +0 -0
  393. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_overview.py +0 -0
  394. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_pipeline.py +0 -0
  395. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_pluggable_future_resolution.py +0 -0
  396. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_simple.py +0 -0
  397. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_timeout.py +0 -0
  398. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_python_apps/test_type5.py +0 -0
  399. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_radical/__init__.py +0 -0
  400. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_radical/test_mpi_funcs.py +0 -0
  401. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_regression/__init__.py +0 -0
  402. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_regression/test_1480.py +0 -0
  403. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +0 -0
  404. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_regression/test_1653.py +0 -0
  405. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_regression/test_221.py +0 -0
  406. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_regression/test_226.py +0 -0
  407. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_regression/test_2652.py +0 -0
  408. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_regression/test_69a.py +0 -0
  409. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_regression/test_97_parallelism_0.py +0 -0
  410. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_regression/test_98.py +0 -0
  411. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_scaling/__init__.py +0 -0
  412. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_scaling/test_block_error_handler.py +0 -0
  413. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_scaling/test_regression_1621.py +0 -0
  414. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_scaling/test_regression_3568_scaledown_vs_MISSING.py +0 -0
  415. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_scaling/test_regression_3696_oscillation.py +0 -0
  416. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_scaling/test_scale_down.py +0 -0
  417. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +0 -0
  418. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +0 -0
  419. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_scaling/test_shutdown_scalein.py +0 -0
  420. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_scaling/test_worker_interchange_bad_messages_3262.py +0 -0
  421. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_serialization/__init__.py +0 -0
  422. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_serialization/test_2555_caching_deserializer.py +0 -0
  423. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_serialization/test_3495_deserialize_managerlost.py +0 -0
  424. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_serialization/test_basic.py +0 -0
  425. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_serialization/test_htex_code_cache.py +0 -0
  426. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_serialization/test_proxystore_configured.py +0 -0
  427. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_serialization/test_proxystore_impl.py +0 -0
  428. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_shutdown/__init__.py +0 -0
  429. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_shutdown/test_kill_monitoring.py +0 -0
  430. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_staging/__init__.py +0 -0
  431. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_staging/staging_provider.py +0 -0
  432. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_staging/test_1316.py +0 -0
  433. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_staging/test_docs_1.py +0 -0
  434. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_staging/test_docs_2.py +0 -0
  435. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
  436. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_staging/test_file.py +0 -0
  437. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_staging/test_file_apps.py +0 -0
  438. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_staging/test_file_staging.py +0 -0
  439. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_staging/test_output_chain_filenames.py +0 -0
  440. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
  441. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
  442. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_staging/test_staging_globus.py +0 -0
  443. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_staging/test_staging_https.py +0 -0
  444. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_staging/test_staging_stdout.py +0 -0
  445. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_staging/test_zip_in.py +0 -0
  446. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_staging/test_zip_out.py +0 -0
  447. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_staging/test_zip_to_zip.py +0 -0
  448. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_summary.py +0 -0
  449. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_thread_parallelism.py +0 -0
  450. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_threads/__init__.py +0 -0
  451. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_threads/test_configs.py +0 -0
  452. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
  453. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_utils/__init__.py +0 -0
  454. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_utils/test_execute_wait.py +0 -0
  455. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_utils/test_logutils.py +0 -0
  456. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_utils/test_representation_mixin.py +0 -0
  457. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/test_utils/test_sanitize_dns.py +0 -0
  458. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/unit/__init__.py +0 -0
  459. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/unit/test_address.py +0 -0
  460. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/unit/test_file.py +0 -0
  461. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/unit/test_globus_compute_executor.py +0 -0
  462. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/unit/test_usage_tracking.py +0 -0
  463. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/tests/utils.py +0 -0
  464. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/usage_tracking/__init__.py +0 -0
  465. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/usage_tracking/api.py +0 -0
  466. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/usage_tracking/levels.py +0 -0
  467. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/usage_tracking/usage.py +0 -0
  468. {parsl-2025.9.8 → parsl-2025.9.22}/parsl/utils.py +0 -0
  469. {parsl-2025.9.8 → parsl-2025.9.22}/parsl.egg-info/dependency_links.txt +0 -0
  470. {parsl-2025.9.8 → parsl-2025.9.22}/parsl.egg-info/entry_points.txt +0 -0
  471. {parsl-2025.9.8 → parsl-2025.9.22}/parsl.egg-info/requires.txt +0 -0
  472. {parsl-2025.9.8 → parsl-2025.9.22}/parsl.egg-info/top_level.txt +0 -0
  473. {parsl-2025.9.8 → parsl-2025.9.22}/requirements.txt +0 -0
  474. {parsl-2025.9.8 → parsl-2025.9.22}/setup.cfg +0 -0
  475. {parsl-2025.9.8 → parsl-2025.9.22}/setup.py +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: parsl
3
- Version: 2025.9.8
3
+ Version: 2025.9.22
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.09.08.tar.gz
6
+ Download-URL: https://github.com/Parsl/parsl/archive/2025.09.22.tar.gz
7
7
  Author: The Parsl Team
8
8
  Author-email: parsl@googlegroups.com
9
9
  License: Apache 2.0
@@ -101,17 +101,6 @@ class BaseContext(metaclass=ABCMeta):
101
101
  """
102
102
  self._ctx.destroy(linger)
103
103
 
104
- def recreate(self, linger: Optional[int] = None):
105
- """Destroy then recreate the context.
106
-
107
- Parameters
108
- ----------
109
- linger : int, optional
110
- If specified, set LINGER on sockets prior to closing them.
111
- """
112
- self.destroy(linger)
113
- self._ctx = zmq.Context()
114
-
115
104
 
116
105
  class ServerContext(BaseContext):
117
106
  """CurveZMQ server context
@@ -175,11 +164,6 @@ class ServerContext(BaseContext):
175
164
  self.auth_thread.stop()
176
165
  super().destroy(linger)
177
166
 
178
- def recreate(self, linger: Optional[int] = None):
179
- super().recreate(linger)
180
- if self.auth_thread:
181
- self.auth_thread = self._start_auth_thread()
182
-
183
167
 
184
168
  class ClientContext(BaseContext):
185
169
  """CurveZMQ client context
@@ -1,17 +1,11 @@
1
- import os
2
-
3
- from parsl.serialize import unpack_res_spec_apply_message
1
+ from parsl.serialize import unpack_apply_message
4
2
 
5
3
 
6
4
  def execute_task(bufs: bytes):
7
5
  """Deserialize the buffer and execute the task.
8
6
  Returns the result or throws exception.
9
7
  """
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])
8
+ f, args, kwargs = unpack_apply_message(bufs)
15
9
 
16
10
  # We might need to look into callability of the function from itself
17
11
  # since we change it's name in the new namespace
@@ -24,7 +24,7 @@ from parsl.executors.flux.execute_parsl_task import __file__ as _WORKER_PATH
24
24
  from parsl.executors.flux.flux_instance_manager import __file__ as _MANAGER_PATH
25
25
  from parsl.providers import LocalProvider
26
26
  from parsl.providers.base import ExecutionProvider
27
- from parsl.serialize import deserialize, pack_res_spec_apply_message
27
+ from parsl.serialize import deserialize, pack_apply_message
28
28
  from parsl.serialize.errors import SerializationError
29
29
  from parsl.utils import RepresentationMixin
30
30
 
@@ -284,10 +284,8 @@ class FluxExecutor(ParslExecutor, RepresentationMixin):
284
284
  infile = os.path.join(self.working_dir, f"{task_id}_in{os.extsep}pkl")
285
285
  outfile = os.path.join(self.working_dir, f"{task_id}_out{os.extsep}pkl")
286
286
  try:
287
- fn_buf = pack_res_spec_apply_message(
288
- func, args, kwargs,
289
- resource_specification={},
290
- buffer_threshold=1024 * 1024
287
+ fn_buf = pack_apply_message(
288
+ func, args, kwargs, buffer_threshold=1 << 20,
291
289
  )
292
290
  except TypeError:
293
291
  raise SerializationError(func.__name__)
@@ -35,7 +35,7 @@ from parsl.monitoring.radios.zmq_router import ZMQRadioReceiver, start_zmq_recei
35
35
  from parsl.process_loggers import wrap_with_logs
36
36
  from parsl.providers import LocalProvider
37
37
  from parsl.providers.base import ExecutionProvider
38
- from parsl.serialize import deserialize, pack_res_spec_apply_message
38
+ from parsl.serialize import deserialize, pack_apply_message
39
39
  from parsl.serialize.errors import DeserializationError, SerializationError
40
40
  from parsl.usage_tracking.api import UsageInformation
41
41
  from parsl.utils import RepresentationMixin
@@ -332,6 +332,13 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
332
332
  self.encrypted = encrypted
333
333
  self.cert_dir = None
334
334
 
335
+ # This flag will enable/disable internal Python mismatch checks
336
+ # between the interchange and worker managers. This serves as a
337
+ # temporary workaround for Globus Compute to support different
338
+ # Python versions at the endpoint and worker layers. We can drop
339
+ # the flag once we implement modular internal message protocols.
340
+ self._check_python_mismatch: bool = True
341
+
335
342
  if not launch_cmd:
336
343
  launch_cmd = DEFAULT_LAUNCH_CMD
337
344
  self.launch_cmd = launch_cmd
@@ -568,6 +575,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
568
575
  "cert_dir": self.cert_dir,
569
576
  "manager_selector": self.manager_selector,
570
577
  "run_id": self.run_id,
578
+ "_check_python_mismatch": self._check_python_mismatch,
571
579
  }
572
580
 
573
581
  config_pickle = pickle.dumps(interchange_config)
@@ -700,9 +708,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
700
708
  self.tasks[task_id] = fut
701
709
 
702
710
  try:
703
- fn_buf = pack_res_spec_apply_message(func, args, kwargs,
704
- resource_specification=resource_specification,
705
- buffer_threshold=1024 * 1024)
711
+ fn_buf = pack_apply_message(func, args, kwargs, buffer_threshold=1 << 20)
706
712
  except TypeError:
707
713
  raise SerializationError(func.__name__)
708
714
 
@@ -23,7 +23,6 @@ from parsl.monitoring.radios.base import MonitoringRadioSender
23
23
  from parsl.monitoring.radios.zmq import ZMQRadioSender
24
24
  from parsl.process_loggers import wrap_with_logs
25
25
  from parsl.serialize import serialize as serialize_object
26
- from parsl.utils import setproctitle
27
26
  from parsl.version import VERSION as PARSL_VERSION
28
27
 
29
28
  PKL_HEARTBEAT_CODE = pickle.dumps((2 ** 32) - 1)
@@ -56,6 +55,7 @@ class Interchange:
56
55
  cert_dir: Optional[str],
57
56
  manager_selector: ManagerSelector,
58
57
  run_id: str,
58
+ _check_python_mismatch: bool,
59
59
  ) -> None:
60
60
  """
61
61
  Parameters
@@ -99,6 +99,11 @@ class Interchange:
99
99
 
100
100
  cert_dir : str | None
101
101
  Path to the certificate directory.
102
+
103
+ _check_python_mismatch : bool
104
+ If True, the interchange and worker managers must run the same version of
105
+ Python. Running different versions can cause inter-process communication
106
+ errors, so proceed with caution.
102
107
  """
103
108
  self.cert_dir = cert_dir
104
109
  self.logdir = logdir
@@ -126,6 +131,7 @@ class Interchange:
126
131
  logger.info("Connected to client")
127
132
 
128
133
  self.run_id = run_id
134
+ self._check_python_mismatch = _check_python_mismatch
129
135
 
130
136
  self.hub_address = hub_address
131
137
  self.hub_zmq_port = hub_zmq_port
@@ -213,7 +219,7 @@ class Interchange:
213
219
 
214
220
  reply: Any # the type of reply depends on the command_req received (aka this needs dependent types...)
215
221
 
216
- if self.command_channel in self.socks and self.socks[self.command_channel] == zmq.POLLIN:
222
+ if self.socks.get(self.command_channel) == zmq.POLLIN:
217
223
  logger.debug("entering command_server section")
218
224
 
219
225
  command_req = self.command_channel.recv_pyobj()
@@ -321,7 +327,7 @@ class Interchange:
321
327
  """Process incoming task message(s).
322
328
  """
323
329
 
324
- if self.task_incoming in self.socks and self.socks[self.task_incoming] == zmq.POLLIN:
330
+ if self.socks.get(self.task_incoming) == zmq.POLLIN:
325
331
  logger.debug("start task_incoming section")
326
332
  msg = self.task_incoming.recv_pyobj()
327
333
 
@@ -396,7 +402,9 @@ class Interchange:
396
402
  logger.info(f'Registration info for manager {manager_id!r}: {meta}')
397
403
  self._send_monitoring_info(monitoring_radio, new_rec)
398
404
 
399
- if (mgr_minor_py, mgr_parsl_v) != (ix_minor_py, ix_parsl_v):
405
+ python_mismatch: bool = ix_minor_py != mgr_minor_py
406
+ parsl_mismatch: bool = ix_parsl_v != mgr_parsl_v
407
+ if parsl_mismatch or (self._check_python_mismatch and python_mismatch):
400
408
  kill_event.set()
401
409
  vm_exc = VersionMismatch(
402
410
  f"py.v={ix_minor_py} parsl.v={ix_parsl_v}",
@@ -618,6 +626,8 @@ def start_file_logger(filename: str, level: int = logging.DEBUG, format_string:
618
626
 
619
627
 
620
628
  if __name__ == "__main__":
629
+ from parsl.utils import setproctitle
630
+
621
631
  setproctitle("parsl: HTEX interchange")
622
632
 
623
633
  config = pickle.load(sys.stdin.buffer)
@@ -9,7 +9,6 @@ from enum import Enum
9
9
  from typing import Dict, List, Optional
10
10
 
11
11
  from parsl.multiprocessing import SpawnContext
12
- from parsl.serialize import pack_res_spec_apply_message, unpack_res_spec_apply_message
13
12
 
14
13
  logger = logging.getLogger(__name__)
15
14
 
@@ -167,9 +166,7 @@ class MPITaskScheduler(TaskScheduler):
167
166
 
168
167
  def put_task(self, task_package: dict):
169
168
  """Schedule task if resources are available otherwise backlog the task"""
170
- user_ns = locals()
171
- user_ns.update({"__builtins__": __builtins__})
172
- _f, _args, _kwargs, resource_spec = unpack_res_spec_apply_message(task_package["buffer"])
169
+ resource_spec = task_package.get("resource_spec", {})
173
170
 
174
171
  nodes_needed = resource_spec.get("num_nodes")
175
172
  tid = task_package["task_id"]
@@ -183,9 +180,6 @@ class MPITaskScheduler(TaskScheduler):
183
180
  else:
184
181
  resource_spec["MPI_NODELIST"] = ",".join(allocated_nodes)
185
182
  self._map_tasks_to_nodes[tid] = allocated_nodes
186
- buffer = pack_res_spec_apply_message(_f, _args, _kwargs, resource_spec)
187
- task_package["buffer"] = buffer
188
- task_package["resource_spec"] = resource_spec
189
183
 
190
184
  self.pending_task_q.put(task_package)
191
185
 
@@ -603,6 +603,10 @@ def update_resource_spec_env_vars(mpi_launcher: str, resource_spec: Dict, node_i
603
603
 
604
604
 
605
605
  def _init_mpi_env(mpi_launcher: str, resource_spec: Dict):
606
+ for varname in resource_spec:
607
+ envname = "PARSL_" + str(varname).upper()
608
+ os.environ[envname] = str(resource_spec[varname])
609
+
606
610
  node_list = resource_spec.get("MPI_NODELIST")
607
611
  if node_list is None:
608
612
  return
@@ -753,8 +757,8 @@ def worker(
753
757
  worker_enqueued = True
754
758
 
755
759
  try:
756
- # The worker will receive {'task_id':<tid>, 'buffer':<buf>}
757
760
  req = task_queue.get(timeout=task_queue_timeout)
761
+ # req is {'task_id':<tid>, 'buffer':<buf>, 'resource_spec':<dict>}
758
762
  except queue.Empty:
759
763
  continue
760
764
 
@@ -74,51 +74,37 @@ class CommandClient:
74
74
 
75
75
  reply = '__PARSL_ZMQ_PIPES_MAGIC__'
76
76
  with self._lock:
77
- for _ in range(max_retries):
78
- try:
79
- logger.debug("Sending command client command")
80
-
81
- if timeout_s is not None:
82
- remaining_time_s = start_time_s + timeout_s - time.monotonic()
83
- poll_result = self.zmq_socket.poll(timeout=remaining_time_s * 1000, flags=zmq.POLLOUT)
84
- if poll_result == zmq.POLLOUT:
85
- pass # this is OK, so continue
86
- elif poll_result == 0:
87
- raise CommandClientTimeoutError("Waiting for command channel to be ready for a command")
88
- else:
89
- raise InternalConsistencyError(f"ZMQ poll returned unexpected value: {poll_result}")
90
-
91
- self.zmq_socket.send_pyobj(message, copy=True)
92
-
93
- if timeout_s is not None:
94
- logger.debug("Polling for command client response or timeout")
95
- remaining_time_s = start_time_s + timeout_s - time.monotonic()
96
- poll_result = self.zmq_socket.poll(timeout=remaining_time_s * 1000, flags=zmq.POLLIN)
97
- if poll_result == zmq.POLLIN:
98
- pass # this is OK, so continue
99
- elif poll_result == 0:
100
- logger.error("Command timed-out - command client is now bad forever")
101
- self.ok = False
102
- raise CommandClientTimeoutError("Waiting for a reply from command channel")
103
- else:
104
- raise InternalConsistencyError(f"ZMQ poll returned unexpected value: {poll_result}")
105
-
106
- logger.debug("Receiving command client response")
107
- reply = self.zmq_socket.recv_pyobj()
108
- logger.debug("Received command client response")
109
- except zmq.ZMQError:
110
- logger.exception("Potential ZMQ REQ-REP deadlock caught")
111
- logger.info("Trying to reestablish context")
112
- self.zmq_context.recreate()
113
- self.create_socket_and_bind()
77
+ logger.debug("Sending command client command")
78
+
79
+ if timeout_s is not None:
80
+ remaining_time_s = start_time_s + timeout_s - time.monotonic()
81
+ poll_result = self.zmq_socket.poll(timeout=remaining_time_s * 1000, flags=zmq.POLLOUT)
82
+ if poll_result == zmq.POLLOUT:
83
+ pass # this is OK, so continue
84
+ elif poll_result == 0:
85
+ raise CommandClientTimeoutError("Waiting for command channel to be ready for a command")
114
86
  else:
115
- break
116
-
117
- if reply == '__PARSL_ZMQ_PIPES_MAGIC__':
118
- logger.error("Command channel run retries exhausted. Unable to run command")
119
- raise Exception("Command Channel retries exhausted")
87
+ raise InternalConsistencyError(f"ZMQ poll returned unexpected value: {poll_result}")
88
+
89
+ self.zmq_socket.send_pyobj(message, copy=True)
90
+
91
+ if timeout_s is not None:
92
+ logger.debug("Polling for command client response or timeout")
93
+ remaining_time_s = start_time_s + timeout_s - time.monotonic()
94
+ poll_result = self.zmq_socket.poll(timeout=remaining_time_s * 1000, flags=zmq.POLLIN)
95
+ if poll_result == zmq.POLLIN:
96
+ pass # this is OK, so continue
97
+ elif poll_result == 0:
98
+ logger.error("Command timed-out - command client is now bad forever")
99
+ self.ok = False
100
+ raise CommandClientTimeoutError("Waiting for a reply from command channel")
101
+ else:
102
+ raise InternalConsistencyError(f"ZMQ poll returned unexpected value: {poll_result}")
120
103
 
121
- return reply
104
+ logger.debug("Receiving command client response")
105
+ reply = self.zmq_socket.recv_pyobj()
106
+ logger.debug("Received command client response")
107
+ return reply
122
108
 
123
109
  def close(self):
124
110
  self.zmq_socket.close()
@@ -20,7 +20,7 @@ from parsl.app.errors import BashExitFailure, RemoteExceptionWrapper
20
20
  from parsl.app.python import timeout
21
21
  from parsl.data_provider.files import File
22
22
  from parsl.executors.base import ParslExecutor
23
- from parsl.serialize import deserialize, pack_res_spec_apply_message
23
+ from parsl.serialize import deserialize, pack_apply_message
24
24
  from parsl.serialize.errors import DeserializationError, SerializationError
25
25
  from parsl.utils import RepresentationMixin
26
26
 
@@ -441,11 +441,7 @@ class RadicalPilotExecutor(ParslExecutor, RepresentationMixin):
441
441
 
442
442
  def _pack_and_apply_message(self, func, args, kwargs):
443
443
  try:
444
- buffer = pack_res_spec_apply_message(func,
445
- args,
446
- kwargs,
447
- resource_specification={},
448
- buffer_threshold=1024 * 1024)
444
+ buffer = pack_apply_message(func, args, kwargs, buffer_threshold=1 << 20)
449
445
  task_func = rp.utils.serialize_bson(buffer)
450
446
  except TypeError:
451
447
  raise SerializationError(func.__name__)
@@ -5,7 +5,7 @@ import radical.pilot as rp
5
5
  import parsl.app.errors as pe
6
6
  from parsl.app.bash import remote_side_bash_executor
7
7
  from parsl.executors.execute_task import execute_task
8
- from parsl.serialize import serialize, unpack_res_spec_apply_message
8
+ from parsl.serialize import serialize, unpack_apply_message
9
9
 
10
10
 
11
11
  class ParslWorker:
@@ -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)
36
+ func, args, kwargs = unpack_apply_message(buffer)
37
37
  ret = remote_side_bash_executor(func, *args, **kwargs)
38
38
  exc = (None, None)
39
39
  val = None
@@ -11,9 +11,9 @@ import typeguard
11
11
 
12
12
  from parsl.monitoring.types import TaggedMonitoringMessage
13
13
  from parsl.multiprocessing import (
14
- SizedQueue,
15
14
  SpawnEvent,
16
15
  SpawnProcess,
16
+ SpawnQueue,
17
17
  join_terminate_close_proc,
18
18
  )
19
19
  from parsl.utils import RepresentationMixin
@@ -126,7 +126,7 @@ class MonitoringHub(RepresentationMixin):
126
126
  self.monitoring_hub_active = True
127
127
 
128
128
  self.resource_msgs: Queue[TaggedMonitoringMessage]
129
- self.resource_msgs = SizedQueue()
129
+ self.resource_msgs = SpawnQueue()
130
130
 
131
131
  self.dbm_exit_event: ms.Event
132
132
  self.dbm_exit_event = SpawnEvent()
@@ -4,7 +4,6 @@
4
4
  import logging
5
5
  import multiprocessing
6
6
  import multiprocessing.queues
7
- import platform
8
7
  from multiprocessing.context import ForkProcess as ForkProcessType
9
8
  from multiprocessing.context import SpawnProcess as SpawnProcessType
10
9
  from typing import Callable
@@ -21,54 +20,6 @@ SpawnEvent = SpawnContext.Event
21
20
  SpawnQueue = SpawnContext.Queue
22
21
 
23
22
 
24
- class MacSafeQueue(multiprocessing.queues.Queue):
25
- """ Multiprocessing queues do not have qsize attributes on MacOS.
26
- This is slower but more portable version of the multiprocessing Queue
27
- that adds a explicit counter
28
-
29
- Reference : https://github.com/keras-team/autokeras/commit/4ddd568b06b4045ace777bc0fb7bc18573b85a75
30
- """
31
-
32
- def __init__(self, *args, **kwargs):
33
- if 'ctx' not in kwargs:
34
- kwargs['ctx'] = multiprocessing.get_context('spawn')
35
- super().__init__(*args, **kwargs)
36
- self._counter = multiprocessing.Value('i', 0)
37
-
38
- def put(self, *args, **kwargs):
39
- # logger.critical("Putting item {}".format(args))
40
- x = super().put(*args, **kwargs)
41
- with self._counter.get_lock():
42
- self._counter.value += 1
43
- return x
44
-
45
- def get(self, *args, **kwargs):
46
- x = super().get(*args, **kwargs)
47
- with self._counter.get_lock():
48
- self._counter.value -= 1
49
- # logger.critical("Getting item {}".format(x))
50
- return x
51
-
52
- def qsize(self):
53
- return self._counter.value
54
-
55
- def empty(self):
56
- return not self._counter.value
57
-
58
-
59
- # SizedQueue should be constructable using the same calling
60
- # convention as multiprocessing.Queue but that entire signature
61
- # isn't expressible in mypy 0.790
62
- SizedQueue: Callable[..., multiprocessing.Queue]
63
-
64
-
65
- if platform.system() != 'Darwin':
66
- import multiprocessing
67
- SizedQueue = SpawnQueue
68
- else:
69
- SizedQueue = MacSafeQueue
70
-
71
-
72
23
  def join_terminate_close_proc(process: SpawnProcessType, *, timeout: int = 30) -> None:
73
24
  """Increasingly aggressively terminate a process.
74
25
 
@@ -0,0 +1,13 @@
1
+ from parsl.serialize.facade import (
2
+ deserialize,
3
+ pack_apply_message,
4
+ serialize,
5
+ unpack_apply_message,
6
+ )
7
+
8
+ __all__ = (
9
+ "serialize",
10
+ "deserialize",
11
+ "pack_apply_message",
12
+ "unpack_apply_message",
13
+ )
@@ -62,44 +62,12 @@ def pack_apply_message(func: Any, args: Any, kwargs: Any, buffer_threshold: int
62
62
  return packed_buffer
63
63
 
64
64
 
65
- def pack_res_spec_apply_message(func: Any, args: Any, kwargs: Any, resource_specification: Any, buffer_threshold: int = int(128 * 1e6)) -> bytes:
66
- """Serialize and pack function, parameters, and resource_specification
67
-
68
- Parameters
69
- ----------
70
-
71
- func: Function
72
- A function to ship
73
-
74
- args: Tuple/list of objects
75
- positional parameters as a list
76
-
77
- kwargs: Dict
78
- Dict containing named parameters
79
-
80
- resource_specification: Dict
81
- Dict containing application resource specification
82
-
83
- buffer_threshold: int
84
- Limits buffer to specified size in bytes. Exceeding this limit would give you
85
- a warning in the log. Default is 128MB.
86
- """
87
- return pack_apply_message(func, args, (kwargs, resource_specification), buffer_threshold=buffer_threshold)
88
-
89
-
90
65
  def unpack_apply_message(packed_buffer: bytes) -> List[Any]:
91
66
  """ Unpack and deserialize function and parameters
92
67
  """
93
68
  return [deserialize(buf) for buf in unpack_buffers(packed_buffer)]
94
69
 
95
70
 
96
- def unpack_res_spec_apply_message(packed_buffer: bytes) -> List[Any]:
97
- """ Unpack and deserialize function, parameters, and resource_specification
98
- """
99
- func, args, (kwargs, resource_spec) = unpack_apply_message(packed_buffer)
100
- return [func, args, kwargs, resource_spec]
101
-
102
-
103
71
  def serialize(obj: Any, buffer_threshold: int = int(1e6)) -> bytes:
104
72
  """ Try available serialization methods one at a time
105
73
 
@@ -296,48 +296,6 @@ def test_server_context_destroy(server_ctx: curvezmq.ServerContext, encrypted: b
296
296
  assert not server_ctx.auth_thread.pipe
297
297
 
298
298
 
299
- @pytest.mark.local
300
- @pytest.mark.parametrize("encrypted", (True, False), indirect=True)
301
- def test_client_context_recreate(client_ctx: curvezmq.ClientContext):
302
- hidden_ctx = client_ctx._ctx
303
- sock = client_ctx.socket(zmq.REQ)
304
-
305
- assert not sock.closed
306
- assert not client_ctx.closed
307
-
308
- client_ctx.recreate()
309
-
310
- assert sock.closed
311
- assert not client_ctx.closed
312
- assert hidden_ctx != client_ctx._ctx
313
- assert hidden_ctx.closed
314
-
315
-
316
- @pytest.mark.local
317
- @pytest.mark.parametrize("encrypted", (True, False), indirect=True)
318
- def test_server_context_recreate(server_ctx: curvezmq.ServerContext, encrypted: bool):
319
- hidden_ctx = server_ctx._ctx
320
- sock = server_ctx.socket(zmq.REP)
321
-
322
- assert not sock.closed
323
- assert not server_ctx.closed
324
- if encrypted:
325
- assert server_ctx.auth_thread
326
- auth_thread = server_ctx.auth_thread
327
- assert auth_thread.pipe
328
-
329
- server_ctx.recreate()
330
-
331
- assert sock.closed
332
- assert not server_ctx.closed
333
- assert hidden_ctx.closed
334
- assert hidden_ctx != server_ctx._ctx
335
- if encrypted:
336
- assert server_ctx.auth_thread
337
- assert auth_thread != server_ctx.auth_thread
338
- assert server_ctx.auth_thread.pipe
339
-
340
-
341
299
  @pytest.mark.local
342
300
  @pytest.mark.parametrize("encrypted", (True, False), indirect=True)
343
301
  def test_connection(
@@ -0,0 +1,20 @@
1
+ import os
2
+
3
+ import pytest
4
+
5
+ from parsl.executors.execute_task import execute_task
6
+ from parsl.serialize.facade import pack_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_apply_message(addemup, args, kwargs)
19
+ res = execute_task(buff)
20
+ assert res == addemup(*args, **kwargs)
@@ -0,0 +1,54 @@
1
+ import time
2
+ from threading import Event, Thread
3
+
4
+ import pytest
5
+
6
+ import parsl
7
+ from parsl.tests.configs.htex_local import fresh_config as local_config
8
+
9
+ N_THREADS = 50
10
+ DURATION_S = 10
11
+
12
+
13
+ @pytest.mark.local
14
+ def test_concurrency_blast():
15
+ """Blast interchange command channel from many threads.
16
+ """
17
+
18
+ cc = parsl.dfk().executors['htex_local'].command_client
19
+
20
+ threads = []
21
+
22
+ ok_so_far = True
23
+
24
+ for _ in range(N_THREADS):
25
+
26
+ # This event will be set if the thread reaches the end of its body.
27
+ event = Event()
28
+
29
+ thread = Thread(target=blast, args=(cc, event))
30
+ threads.append((thread, event))
31
+
32
+ for thread, event in threads:
33
+ thread.start()
34
+
35
+ for thread, event in threads:
36
+ thread.join()
37
+ if not event.is_set():
38
+ ok_so_far = False
39
+
40
+ assert ok_so_far, "at least one thread did not exit normally"
41
+
42
+
43
+ def blast(cc, e):
44
+ target_end = time.monotonic() + DURATION_S
45
+
46
+ while time.monotonic() < target_end:
47
+ cc.run("WORKERS")
48
+ cc.run("MANGERs_PACKAGES")
49
+ cc.run("CONNECTED_BLOCKS")
50
+ cc.run("WORKER_BINDS")
51
+
52
+ # If any of the preceeding cc.run calls raises an exception, the thread
53
+ # will not set its successful completion event.
54
+ e.set()
@@ -50,7 +50,8 @@ def test_exit_with_bad_registration(tmpd_cwd, try_assert):
50
50
  "logging_level": logging.DEBUG,
51
51
  "cert_dir": None,
52
52
  "manager_selector": RandomManagerSelector(),
53
- "run_id": "test"
53
+ "run_id": "test",
54
+ "_check_python_mismatch": True,
54
55
  }
55
56
 
56
57
  config_pickle = pickle.dumps(interchange_config)