parsl 2025.9.1__tar.gz → 2025.9.15__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 (473) hide show
  1. {parsl-2025.9.1/parsl.egg-info → parsl-2025.9.15}/PKG-INFO +2 -2
  2. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/__init__.py +0 -4
  3. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/curvezmq.py +0 -16
  4. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/dataflow/dflow.py +1 -3
  5. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/dataflow/memoization.py +0 -14
  6. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/high_throughput/executor.py +8 -0
  7. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/high_throughput/interchange.py +26 -23
  8. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/high_throughput/zmq_pipes.py +29 -43
  9. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/db_manager.py +8 -8
  10. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/monitoring.py +2 -2
  11. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/radios/udp_router.py +2 -2
  12. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/radios/zmq_router.py +2 -2
  13. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/multiprocessing.py +0 -49
  14. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +6 -3
  15. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_curvezmq.py +0 -42
  16. parsl-2025.9.15/parsl/tests/test_htex/test_command_concurrency_regression_1321.py +54 -0
  17. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_interchange_exit_bad_registration.py +2 -1
  18. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_priority_queue.py +1 -0
  19. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_zmq_binding.py +2 -1
  20. parsl-2025.9.15/parsl/tests/test_python_apps/test_memoize_exception.py +41 -0
  21. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/version.py +1 -1
  22. {parsl-2025.9.1 → parsl-2025.9.15/parsl.egg-info}/PKG-INFO +2 -2
  23. {parsl-2025.9.1 → parsl-2025.9.15}/parsl.egg-info/SOURCES.txt +2 -6
  24. parsl-2025.9.1/parsl/tests/site_tests/test_provider.py +0 -88
  25. parsl-2025.9.1/parsl/tests/site_tests/test_site.py +0 -70
  26. parsl-2025.9.1/parsl/tests/test_aalst_patterns.py +0 -474
  27. parsl-2025.9.1/parsl/tests/test_docs/test_workflow2.py +0 -42
  28. parsl-2025.9.1/parsl/tests/test_error_handling/test_rand_fail.py +0 -171
  29. parsl-2025.9.1/parsl/tests/test_regression/test_854.py +0 -62
  30. {parsl-2025.9.1 → parsl-2025.9.15}/LICENSE +0 -0
  31. {parsl-2025.9.1 → parsl-2025.9.15}/MANIFEST.in +0 -0
  32. {parsl-2025.9.1 → parsl-2025.9.15}/README.rst +0 -0
  33. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/addresses.py +0 -0
  34. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/app/__init__.py +0 -0
  35. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/app/app.py +0 -0
  36. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/app/bash.py +0 -0
  37. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/app/errors.py +0 -0
  38. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/app/futures.py +0 -0
  39. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/app/python.py +0 -0
  40. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/benchmark/__init__.py +0 -0
  41. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/benchmark/perf.py +0 -0
  42. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/concurrent/__init__.py +0 -0
  43. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/config.py +0 -0
  44. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/ASPIRE1.py +0 -0
  45. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/Azure.py +0 -0
  46. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/__init__.py +0 -0
  47. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/anvil.py +0 -0
  48. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/bridges.py +0 -0
  49. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/cc_in2p3.py +0 -0
  50. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/delta.py +0 -0
  51. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/ec2.py +0 -0
  52. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/expanse.py +0 -0
  53. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/frontera.py +0 -0
  54. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/gc_multisite.py +0 -0
  55. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/gc_tutorial.py +0 -0
  56. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/htex_local.py +0 -0
  57. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/illinoiscluster.py +0 -0
  58. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/improv.py +0 -0
  59. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/kubernetes.py +0 -0
  60. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/local_threads.py +0 -0
  61. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/midway.py +0 -0
  62. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/osg.py +0 -0
  63. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/polaris.py +0 -0
  64. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/stampede2.py +0 -0
  65. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/summit.py +0 -0
  66. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/toss3_llnl.py +0 -0
  67. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/vineex_local.py +0 -0
  68. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/configs/wqex_local.py +0 -0
  69. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/data_provider/__init__.py +0 -0
  70. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/data_provider/data_manager.py +0 -0
  71. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/data_provider/file_noop.py +0 -0
  72. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/data_provider/files.py +0 -0
  73. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/data_provider/ftp.py +0 -0
  74. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/data_provider/globus.py +0 -0
  75. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/data_provider/http.py +0 -0
  76. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/data_provider/rsync.py +0 -0
  77. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/data_provider/staging.py +0 -0
  78. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/data_provider/zip.py +0 -0
  79. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/dataflow/__init__.py +0 -0
  80. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/dataflow/dependency_resolvers.py +0 -0
  81. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/dataflow/errors.py +0 -0
  82. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/dataflow/futures.py +0 -0
  83. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/dataflow/rundirs.py +0 -0
  84. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/dataflow/states.py +0 -0
  85. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/dataflow/taskrecord.py +0 -0
  86. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/errors.py +0 -0
  87. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/__init__.py +0 -0
  88. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/base.py +0 -0
  89. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/errors.py +0 -0
  90. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/execute_task.py +0 -0
  91. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/flux/__init__.py +0 -0
  92. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/flux/execute_parsl_task.py +0 -0
  93. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/flux/executor.py +0 -0
  94. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/flux/flux_instance_manager.py +0 -0
  95. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/globus_compute.py +0 -0
  96. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/high_throughput/__init__.py +0 -0
  97. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/high_throughput/errors.py +0 -0
  98. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/high_throughput/manager_record.py +0 -0
  99. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/high_throughput/manager_selector.py +0 -0
  100. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/high_throughput/monitoring_info.py +0 -0
  101. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/high_throughput/mpi_executor.py +0 -0
  102. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/high_throughput/mpi_prefix_composer.py +0 -0
  103. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/high_throughput/mpi_resource_management.py +0 -0
  104. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/high_throughput/probe.py +0 -0
  105. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/high_throughput/process_worker_pool.py +0 -0
  106. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/radical/__init__.py +0 -0
  107. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/radical/executor.py +0 -0
  108. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/radical/rpex_resources.py +0 -0
  109. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/radical/rpex_worker.py +0 -0
  110. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/status_handling.py +0 -0
  111. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/taskvine/__init__.py +0 -0
  112. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/taskvine/errors.py +0 -0
  113. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/taskvine/exec_parsl_function.py +0 -0
  114. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/taskvine/executor.py +0 -0
  115. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/taskvine/factory.py +0 -0
  116. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/taskvine/factory_config.py +0 -0
  117. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/taskvine/manager.py +0 -0
  118. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/taskvine/manager_config.py +0 -0
  119. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/taskvine/utils.py +0 -0
  120. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/threads.py +0 -0
  121. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/workqueue/__init__.py +0 -0
  122. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/workqueue/errors.py +0 -0
  123. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/workqueue/exec_parsl_function.py +0 -0
  124. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/workqueue/executor.py +0 -0
  125. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/workqueue/parsl_coprocess.py +0 -0
  126. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
  127. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/jobs/__init__.py +0 -0
  128. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/jobs/error_handlers.py +0 -0
  129. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/jobs/errors.py +0 -0
  130. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/jobs/job_status_poller.py +0 -0
  131. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/jobs/states.py +0 -0
  132. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/jobs/strategy.py +0 -0
  133. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/launchers/__init__.py +0 -0
  134. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/launchers/base.py +0 -0
  135. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/launchers/errors.py +0 -0
  136. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/launchers/launchers.py +0 -0
  137. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/log_utils.py +0 -0
  138. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/__init__.py +0 -0
  139. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/errors.py +0 -0
  140. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/message_type.py +0 -0
  141. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/queries/__init__.py +0 -0
  142. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/queries/pandas.py +0 -0
  143. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/radios/__init__.py +0 -0
  144. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/radios/base.py +0 -0
  145. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/radios/filesystem.py +0 -0
  146. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/radios/filesystem_router.py +0 -0
  147. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/radios/htex.py +0 -0
  148. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/radios/multiprocessing.py +0 -0
  149. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/radios/udp.py +0 -0
  150. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/radios/zmq.py +0 -0
  151. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/remote.py +0 -0
  152. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/types.py +0 -0
  153. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/__init__.py +0 -0
  154. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/app.py +0 -0
  155. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/models.py +0 -0
  156. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/plots/__init__.py +0 -0
  157. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
  158. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
  159. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/plots/default/workflow_plots.py +0 -0
  160. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +0 -0
  161. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
  162. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
  163. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/templates/app.html +0 -0
  164. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/templates/dag.html +0 -0
  165. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/templates/error.html +0 -0
  166. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/templates/layout.html +0 -0
  167. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
  168. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/templates/task.html +0 -0
  169. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/templates/workflow.html +0 -0
  170. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
  171. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/utils.py +0 -0
  172. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/version.py +0 -0
  173. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/monitoring/visualization/views.py +0 -0
  174. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/process_loggers.py +0 -0
  175. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/__init__.py +0 -0
  176. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/aws/__init__.py +0 -0
  177. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/aws/aws.py +0 -0
  178. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/aws/template.py +0 -0
  179. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/azure/__init__.py +0 -0
  180. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/azure/azure.py +0 -0
  181. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/azure/template.py +0 -0
  182. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/base.py +0 -0
  183. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/cluster_provider.py +0 -0
  184. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/condor/__init__.py +0 -0
  185. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/condor/condor.py +0 -0
  186. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/condor/template.py +0 -0
  187. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/errors.py +0 -0
  188. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/googlecloud/__init__.py +0 -0
  189. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/googlecloud/googlecloud.py +0 -0
  190. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/grid_engine/__init__.py +0 -0
  191. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/grid_engine/grid_engine.py +0 -0
  192. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/grid_engine/template.py +0 -0
  193. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/kubernetes/__init__.py +0 -0
  194. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/kubernetes/kube.py +0 -0
  195. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/kubernetes/template.py +0 -0
  196. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/local/__init__.py +0 -0
  197. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/local/local.py +0 -0
  198. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/lsf/__init__.py +0 -0
  199. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/lsf/lsf.py +0 -0
  200. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/lsf/template.py +0 -0
  201. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/pbspro/__init__.py +0 -0
  202. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/pbspro/pbspro.py +0 -0
  203. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/pbspro/template.py +0 -0
  204. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/slurm/__init__.py +0 -0
  205. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/slurm/slurm.py +0 -0
  206. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/slurm/template.py +0 -0
  207. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/torque/__init__.py +0 -0
  208. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/torque/template.py +0 -0
  209. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/providers/torque/torque.py +0 -0
  210. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/py.typed +0 -0
  211. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/serialize/__init__.py +0 -0
  212. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/serialize/base.py +0 -0
  213. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/serialize/concretes.py +0 -0
  214. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/serialize/errors.py +0 -0
  215. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/serialize/facade.py +0 -0
  216. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/serialize/proxystore.py +0 -0
  217. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/__init__.py +0 -0
  218. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/callables_helper.py +0 -0
  219. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/__init__.py +0 -0
  220. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/azure_single_node.py +0 -0
  221. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/bluewaters.py +0 -0
  222. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/bridges.py +0 -0
  223. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/cc_in2p3.py +0 -0
  224. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/comet.py +0 -0
  225. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/ec2_single_node.py +0 -0
  226. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/ec2_spot.py +0 -0
  227. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/flux_local.py +0 -0
  228. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/frontera.py +0 -0
  229. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/globus_compute.py +0 -0
  230. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/htex_local.py +0 -0
  231. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/htex_local_alternate.py +0 -0
  232. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/htex_local_intask_staging.py +0 -0
  233. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/htex_local_rsync_staging.py +0 -0
  234. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/local_radical.py +0 -0
  235. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/local_radical_mpi.py +0 -0
  236. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/local_threads.py +0 -0
  237. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
  238. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
  239. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/local_threads_checkpoint_periodic.py +0 -0
  240. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
  241. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
  242. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/local_threads_globus.py +0 -0
  243. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
  244. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/local_threads_no_cache.py +0 -0
  245. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/midway.py +0 -0
  246. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/nscc_singapore.py +0 -0
  247. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/osg_htex.py +0 -0
  248. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/petrelkube.py +0 -0
  249. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/slurm_local.py +0 -0
  250. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/summit.py +0 -0
  251. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/taskvine_ex.py +0 -0
  252. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/user_opts.py +0 -0
  253. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/configs/workqueue_ex.py +0 -0
  254. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/conftest.py +0 -0
  255. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/integration/__init__.py +0 -0
  256. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/integration/latency.py +0 -0
  257. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/integration/test_apps/__init__.py +0 -0
  258. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
  259. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/integration/test_stress/__init__.py +0 -0
  260. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
  261. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
  262. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/manual_tests/__init__.py +0 -0
  263. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/manual_tests/htex_local.py +0 -0
  264. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/manual_tests/test_basic.py +0 -0
  265. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/manual_tests/test_log_filter.py +0 -0
  266. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/manual_tests/test_memory_limits.py +0 -0
  267. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/manual_tests/test_regression_220.py +0 -0
  268. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/manual_tests/test_worker_count.py +0 -0
  269. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/site_tests/__init__.py +0 -0
  270. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/site_tests/site_config_selector.py +0 -0
  271. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/sites/__init__.py +0 -0
  272. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/sites/test_affinity.py +0 -0
  273. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/sites/test_concurrent.py +0 -0
  274. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/sites/test_dynamic_executor.py +0 -0
  275. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/sites/test_ec2.py +0 -0
  276. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/sites/test_launchers.py +0 -0
  277. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/sites/test_mpi/__init__.py +0 -0
  278. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/sites/test_worker_info.py +0 -0
  279. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_bash_apps/__init__.py +0 -0
  280. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
  281. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_basic.py +0 -0
  282. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
  283. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_inputs_default.py +0 -0
  284. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
  285. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -0
  286. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_memoize.py +0 -0
  287. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
  288. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
  289. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_multiline.py +0 -0
  290. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_pipeline.py +0 -0
  291. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_std_uri.py +0 -0
  292. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_bash_apps/test_stdout.py +0 -0
  293. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_callables.py +0 -0
  294. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_checkpointing/__init__.py +0 -0
  295. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_checkpointing/test_periodic.py +0 -0
  296. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
  297. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
  298. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_checkpointing/test_regression_233.py +0 -0
  299. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
  300. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_checkpointing/test_task_exit.py +0 -0
  301. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_docs/__init__.py +0 -0
  302. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_docs/test_from_slides.py +0 -0
  303. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_docs/test_kwargs.py +0 -0
  304. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
  305. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_docs/test_workflow1.py +0 -0
  306. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_docs/test_workflow4.py +0 -0
  307. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_error_handling/__init__.py +0 -0
  308. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_error_handling/test_fail.py +0 -0
  309. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_error_handling/test_python_walltime.py +0 -0
  310. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_error_handling/test_resource_spec.py +0 -0
  311. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_error_handling/test_retries.py +0 -0
  312. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
  313. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
  314. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
  315. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
  316. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_execute_task.py +0 -0
  317. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_flowcontrol/__init__.py +0 -0
  318. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_flux.py +0 -0
  319. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/__init__.py +0 -0
  320. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_basic.py +0 -0
  321. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_block_manager_selector_unit.py +0 -0
  322. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_command_client_timeout.py +0 -0
  323. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_connected_blocks.py +0 -0
  324. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_cpu_affinity_explicit.py +0 -0
  325. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_disconnected_blocks.py +0 -0
  326. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_disconnected_blocks_failing_provider.py +0 -0
  327. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_drain.py +0 -0
  328. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_htex.py +0 -0
  329. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_manager_failure.py +0 -0
  330. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_manager_selector_by_block.py +0 -0
  331. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_managers_command.py +0 -0
  332. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_missing_worker.py +0 -0
  333. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_multiple_disconnected_blocks.py +0 -0
  334. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_resource_spec_validation.py +0 -0
  335. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_htex/test_worker_failure.py +0 -0
  336. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_monitoring/__init__.py +0 -0
  337. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_app_names.py +0 -0
  338. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_basic.py +0 -0
  339. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
  340. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_exit_helper.py +0 -0
  341. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_htex_fuzz_zmq.py +0 -0
  342. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +0 -0
  343. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_incomplete_futures.py +0 -0
  344. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_memoization_representation.py +0 -0
  345. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_radio_filesystem.py +0 -0
  346. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_radio_multiprocessing.py +0 -0
  347. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_radio_udp.py +0 -0
  348. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_radio_zmq.py +0 -0
  349. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_stdouterr.py +0 -0
  350. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
  351. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_mpi_apps/__init__.py +0 -0
  352. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_mpi_apps/test_bad_mpi_config.py +0 -0
  353. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +0 -0
  354. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_mpi_apps/test_mpi_prefix.py +0 -0
  355. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_mpi_apps/test_mpi_scheduler.py +0 -0
  356. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_mpi_apps/test_mpiex.py +0 -0
  357. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_mpi_apps/test_resource_spec.py +0 -0
  358. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_providers/__init__.py +0 -0
  359. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_providers/test_kubernetes_provider.py +0 -0
  360. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_providers/test_local_provider.py +0 -0
  361. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_providers/test_pbspro_template.py +0 -0
  362. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_providers/test_slurm_instantiate.py +0 -0
  363. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_providers/test_slurm_template.py +0 -0
  364. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_providers/test_submiterror_deprecation.py +0 -0
  365. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/__init__.py +0 -0
  366. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
  367. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_basic.py +0 -0
  368. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_context_manager.py +0 -0
  369. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_dep_standard_futures.py +0 -0
  370. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
  371. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_dependencies_deep.py +0 -0
  372. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_depfail_propagation.py +0 -0
  373. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_fail.py +0 -0
  374. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
  375. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
  376. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_futures.py +0 -0
  377. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_garbage_collect.py +0 -0
  378. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
  379. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_inputs_default.py +0 -0
  380. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_join.py +0 -0
  381. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_lifted.py +0 -0
  382. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_mapred.py +0 -0
  383. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
  384. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_memoize_2.py +0 -0
  385. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
  386. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +0 -0
  387. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
  388. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
  389. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_outputs.py +0 -0
  390. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_overview.py +0 -0
  391. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_pipeline.py +0 -0
  392. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_pluggable_future_resolution.py +0 -0
  393. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_simple.py +0 -0
  394. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_timeout.py +0 -0
  395. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_python_apps/test_type5.py +0 -0
  396. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_radical/__init__.py +0 -0
  397. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_radical/test_mpi_funcs.py +0 -0
  398. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_regression/__init__.py +0 -0
  399. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_regression/test_1480.py +0 -0
  400. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +0 -0
  401. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_regression/test_1653.py +0 -0
  402. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_regression/test_221.py +0 -0
  403. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_regression/test_226.py +0 -0
  404. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_regression/test_2652.py +0 -0
  405. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_regression/test_69a.py +0 -0
  406. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_regression/test_97_parallelism_0.py +0 -0
  407. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_regression/test_98.py +0 -0
  408. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_scaling/__init__.py +0 -0
  409. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_scaling/test_block_error_handler.py +0 -0
  410. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_scaling/test_regression_1621.py +0 -0
  411. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_scaling/test_regression_3568_scaledown_vs_MISSING.py +0 -0
  412. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_scaling/test_regression_3696_oscillation.py +0 -0
  413. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_scaling/test_scale_down.py +0 -0
  414. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +0 -0
  415. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +0 -0
  416. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_scaling/test_shutdown_scalein.py +0 -0
  417. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_scaling/test_worker_interchange_bad_messages_3262.py +0 -0
  418. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_serialization/__init__.py +0 -0
  419. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_serialization/test_2555_caching_deserializer.py +0 -0
  420. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_serialization/test_3495_deserialize_managerlost.py +0 -0
  421. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_serialization/test_basic.py +0 -0
  422. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_serialization/test_htex_code_cache.py +0 -0
  423. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_serialization/test_pack_resource_spec.py +0 -0
  424. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_serialization/test_proxystore_configured.py +0 -0
  425. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_serialization/test_proxystore_impl.py +0 -0
  426. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_shutdown/__init__.py +0 -0
  427. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_shutdown/test_kill_monitoring.py +0 -0
  428. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_staging/__init__.py +0 -0
  429. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_staging/staging_provider.py +0 -0
  430. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_staging/test_1316.py +0 -0
  431. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_staging/test_docs_1.py +0 -0
  432. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_staging/test_docs_2.py +0 -0
  433. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
  434. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_staging/test_file.py +0 -0
  435. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_staging/test_file_apps.py +0 -0
  436. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_staging/test_file_staging.py +0 -0
  437. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_staging/test_output_chain_filenames.py +0 -0
  438. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
  439. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
  440. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_staging/test_staging_globus.py +0 -0
  441. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_staging/test_staging_https.py +0 -0
  442. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_staging/test_staging_stdout.py +0 -0
  443. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_staging/test_zip_in.py +0 -0
  444. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_staging/test_zip_out.py +0 -0
  445. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_staging/test_zip_to_zip.py +0 -0
  446. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_summary.py +0 -0
  447. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_thread_parallelism.py +0 -0
  448. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_threads/__init__.py +0 -0
  449. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_threads/test_configs.py +0 -0
  450. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
  451. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_utils/__init__.py +0 -0
  452. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_utils/test_execute_wait.py +0 -0
  453. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_utils/test_logutils.py +0 -0
  454. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_utils/test_representation_mixin.py +0 -0
  455. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/test_utils/test_sanitize_dns.py +0 -0
  456. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/unit/__init__.py +0 -0
  457. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/unit/test_address.py +0 -0
  458. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/unit/test_file.py +0 -0
  459. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/unit/test_globus_compute_executor.py +0 -0
  460. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/unit/test_usage_tracking.py +0 -0
  461. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/tests/utils.py +0 -0
  462. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/usage_tracking/__init__.py +0 -0
  463. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/usage_tracking/api.py +0 -0
  464. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/usage_tracking/levels.py +0 -0
  465. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/usage_tracking/usage.py +0 -0
  466. {parsl-2025.9.1 → parsl-2025.9.15}/parsl/utils.py +0 -0
  467. {parsl-2025.9.1 → parsl-2025.9.15}/parsl.egg-info/dependency_links.txt +0 -0
  468. {parsl-2025.9.1 → parsl-2025.9.15}/parsl.egg-info/entry_points.txt +0 -0
  469. {parsl-2025.9.1 → parsl-2025.9.15}/parsl.egg-info/requires.txt +0 -0
  470. {parsl-2025.9.1 → parsl-2025.9.15}/parsl.egg-info/top_level.txt +0 -0
  471. {parsl-2025.9.1 → parsl-2025.9.15}/requirements.txt +0 -0
  472. {parsl-2025.9.1 → parsl-2025.9.15}/setup.cfg +0 -0
  473. {parsl-2025.9.1 → parsl-2025.9.15}/setup.py +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: parsl
3
- Version: 2025.9.1
3
+ Version: 2025.9.15
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.01.tar.gz
6
+ Download-URL: https://github.com/Parsl/parsl/archive/2025.09.15.tar.gz
7
7
  Author: The Parsl Team
8
8
  Author-email: parsl@googlegroups.com
9
9
  License: Apache 2.0
@@ -15,7 +15,6 @@ AUTO_LOGNAME
15
15
 
16
16
  """
17
17
  import logging
18
- import multiprocessing as _multiprocessing
19
18
  import os
20
19
  import platform
21
20
 
@@ -32,9 +31,6 @@ from parsl.log_utils import set_file_logger, set_stream_logger
32
31
  from parsl.monitoring import MonitoringHub
33
32
  from parsl.version import VERSION
34
33
 
35
- if platform.system() == 'Darwin':
36
- _multiprocessing.set_start_method('fork', force=True)
37
-
38
34
  __author__ = 'The Parsl Team'
39
35
  __version__ = VERSION
40
36
 
@@ -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
@@ -1267,7 +1267,7 @@ class DataFlowKernel:
1267
1267
  # should still see it.
1268
1268
  logger.info("DFK cleanup complete")
1269
1269
 
1270
- def checkpoint(self, tasks: Optional[Sequence[TaskRecord]] = None) -> str:
1270
+ def checkpoint(self, tasks: Optional[Sequence[TaskRecord]] = None) -> None:
1271
1271
  """Checkpoint the dfk incrementally to a checkpoint file.
1272
1272
 
1273
1273
  When called, every task that has been completed yet not
@@ -1328,8 +1328,6 @@ class DataFlowKernel:
1328
1328
  else:
1329
1329
  logger.info("Done checkpointing {} tasks".format(count))
1330
1330
 
1331
- return checkpoint_dir
1332
-
1333
1331
  @staticmethod
1334
1332
  def _log_std_streams(task_record: TaskRecord) -> None:
1335
1333
  tid = task_record['id']
@@ -242,20 +242,6 @@ class Memoizer:
242
242
  assert isinstance(result, Future) or result is None
243
243
  return result
244
244
 
245
- def hash_lookup(self, hashsum: str) -> Future[Any]:
246
- """Lookup a hash in the memoization table.
247
-
248
- Args:
249
- - hashsum (str): The same hashes used to uniquely identify apps+inputs
250
-
251
- Returns:
252
- - Lookup result
253
-
254
- Raises:
255
- - KeyError: if hash not in table
256
- """
257
- return self.memo_lookup_table[hashsum]
258
-
259
245
  def update_memo(self, task: TaskRecord, r: Future[Any]) -> None:
260
246
  """Updates the memoization lookup table with the result from a task.
261
247
 
@@ -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)
@@ -56,6 +56,7 @@ class Interchange:
56
56
  cert_dir: Optional[str],
57
57
  manager_selector: ManagerSelector,
58
58
  run_id: str,
59
+ _check_python_mismatch: bool,
59
60
  ) -> None:
60
61
  """
61
62
  Parameters
@@ -99,6 +100,11 @@ class Interchange:
99
100
 
100
101
  cert_dir : str | None
101
102
  Path to the certificate directory.
103
+
104
+ _check_python_mismatch : bool
105
+ If True, the interchange and worker managers must run the same version of
106
+ Python. Running different versions can cause inter-process communication
107
+ errors, so proceed with caution.
102
108
  """
103
109
  self.cert_dir = cert_dir
104
110
  self.logdir = logdir
@@ -126,6 +132,7 @@ class Interchange:
126
132
  logger.info("Connected to client")
127
133
 
128
134
  self.run_id = run_id
135
+ self._check_python_mismatch = _check_python_mismatch
129
136
 
130
137
  self.hub_address = hub_address
131
138
  self.hub_zmq_port = hub_zmq_port
@@ -222,35 +229,29 @@ class Interchange:
222
229
  reply = self.connected_block_history
223
230
 
224
231
  elif command_req == "WORKERS":
225
- num_workers = 0
226
- for manager in self._ready_managers.values():
227
- num_workers += manager['worker_count']
228
- reply = num_workers
232
+ reply = sum(m['worker_count'] for m in self._ready_managers.values())
229
233
 
230
234
  elif command_req == "MANAGERS":
231
235
  reply = []
232
- for manager_id in self._ready_managers:
233
- m = self._ready_managers[manager_id]
234
- idle_since = m['idle_since']
235
- if idle_since is not None:
236
- idle_duration = time.time() - idle_since
237
- else:
238
- idle_duration = 0.0
239
- resp = {'manager': manager_id.decode('utf-8'),
240
- 'block_id': m['block_id'],
241
- 'worker_count': m['worker_count'],
242
- 'tasks': len(m['tasks']),
243
- 'idle_duration': idle_duration,
244
- 'active': m['active'],
245
- 'parsl_version': m['parsl_version'],
246
- 'python_version': m['python_version'],
247
- 'draining': m['draining']}
236
+ now = time.time()
237
+ for manager_id, m in self._ready_managers.items():
238
+ idle_duration = now - (m['idle_since'] or now)
239
+ resp = {
240
+ 'manager': manager_id.decode('utf-8'),
241
+ 'block_id': m['block_id'],
242
+ 'worker_count': m['worker_count'],
243
+ 'tasks': len(m['tasks']),
244
+ 'idle_duration': idle_duration,
245
+ 'active': m['active'],
246
+ 'parsl_version': m['parsl_version'],
247
+ 'python_version': m['python_version'],
248
+ 'draining': m['draining']
249
+ }
248
250
  reply.append(resp)
249
251
 
250
252
  elif command_req == "MANAGERS_PACKAGES":
251
253
  reply = {}
252
- for manager_id in self._ready_managers:
253
- m = self._ready_managers[manager_id]
254
+ for manager_id, m in self._ready_managers.items():
254
255
  manager_id_str = manager_id.decode('utf-8')
255
256
  reply[manager_id_str] = m["packages"]
256
257
 
@@ -402,7 +403,9 @@ class Interchange:
402
403
  logger.info(f'Registration info for manager {manager_id!r}: {meta}')
403
404
  self._send_monitoring_info(monitoring_radio, new_rec)
404
405
 
405
- if (mgr_minor_py, mgr_parsl_v) != (ix_minor_py, ix_parsl_v):
406
+ python_mismatch: bool = ix_minor_py != mgr_minor_py
407
+ parsl_mismatch: bool = ix_parsl_v != mgr_parsl_v
408
+ if parsl_mismatch or (self._check_python_mismatch and python_mismatch):
406
409
  kill_event.set()
407
410
  vm_exc = VersionMismatch(
408
411
  f"py.v={ix_minor_py} parsl.v={ix_parsl_v}",
@@ -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()
@@ -346,9 +346,9 @@ class DatabaseManager:
346
346
  exception_happened = False
347
347
 
348
348
  while (not self._kill_event.is_set() or
349
- self.pending_priority_queue.qsize() != 0 or self.pending_resource_queue.qsize() != 0 or
350
- self.pending_node_queue.qsize() != 0 or self.pending_block_queue.qsize() != 0 or
351
- resource_queue.qsize() != 0):
349
+ not self.pending_priority_queue.empty() or not self.pending_resource_queue.empty() or
350
+ not self.pending_node_queue.empty() or not self.pending_block_queue.empty() or
351
+ not resource_queue.empty()):
352
352
 
353
353
  """
354
354
  WORKFLOW_INFO and TASK_INFO messages (i.e. priority messages)
@@ -357,9 +357,9 @@ class DatabaseManager:
357
357
  try:
358
358
  logger.debug("""Checking STOP conditions: {}, {}, {}, {}, {}, {}""".format(
359
359
  self._kill_event.is_set(),
360
- self.pending_priority_queue.qsize() != 0, self.pending_resource_queue.qsize() != 0,
361
- self.pending_node_queue.qsize() != 0, self.pending_block_queue.qsize() != 0,
362
- resource_queue.qsize() != 0))
360
+ not self.pending_priority_queue.empty(), not self.pending_resource_queue.empty(),
361
+ not self.pending_node_queue.empty(), not self.pending_block_queue.empty(),
362
+ not resource_queue.empty()))
363
363
 
364
364
  # This is the list of resource messages which can be reprocessed as if they
365
365
  # had just arrived because the corresponding first task message has been
@@ -558,9 +558,9 @@ class DatabaseManager:
558
558
  def _migrate_logs_to_internal(self, logs_queue: mpq.Queue, kill_event: threading.Event) -> None:
559
559
  logger.info("Starting _migrate_logs_to_internal")
560
560
 
561
- while not kill_event.is_set() or logs_queue.qsize() != 0:
561
+ while not kill_event.is_set() or not logs_queue.empty():
562
562
  logger.debug("Checking STOP conditions: kill event: %s, queue has entries: %s",
563
- kill_event.is_set(), logs_queue.qsize() != 0)
563
+ kill_event.is_set(), not logs_queue.empty())
564
564
 
565
565
  try:
566
566
  x = logs_queue.get(timeout=0.1)
@@ -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()
@@ -21,9 +21,9 @@ from parsl.monitoring.errors import MonitoringRouterStartError
21
21
  from parsl.monitoring.radios.base import MonitoringRadioReceiver
22
22
  from parsl.monitoring.radios.multiprocessing import MultiprocessingQueueRadioSender
23
23
  from parsl.multiprocessing import (
24
- SizedQueue,
25
24
  SpawnEvent,
26
25
  SpawnProcess,
26
+ SpawnQueue,
27
27
  join_terminate_close_proc,
28
28
  )
29
29
  from parsl.process_loggers import wrap_with_logs
@@ -198,7 +198,7 @@ def start_udp_receiver(*,
198
198
  hmac_digest: str) -> UDPRadioReceiver:
199
199
 
200
200
  udp_comm_q: Queue[Union[int, str]]
201
- udp_comm_q = SizedQueue(maxsize=10)
201
+ udp_comm_q = SpawnQueue(maxsize=10)
202
202
 
203
203
  router_exit_event = SpawnEvent()
204
204
 
@@ -19,9 +19,9 @@ from parsl.monitoring.errors import MonitoringRouterStartError
19
19
  from parsl.monitoring.radios.multiprocessing import MultiprocessingQueueRadioSender
20
20
  from parsl.monitoring.types import TaggedMonitoringMessage
21
21
  from parsl.multiprocessing import (
22
- SizedQueue,
23
22
  SpawnEvent,
24
23
  SpawnProcess,
24
+ SpawnQueue,
25
25
  join_terminate_close_proc,
26
26
  )
27
27
  from parsl.process_loggers import wrap_with_logs
@@ -158,7 +158,7 @@ def start_zmq_receiver(*,
158
158
  port_range: Tuple[int, int],
159
159
  logdir: str,
160
160
  worker_debug: bool) -> ZMQRadioReceiver:
161
- comm_q = SizedQueue(maxsize=10)
161
+ comm_q = SpawnQueue(maxsize=10)
162
162
 
163
163
  router_exit_event = SpawnEvent()
164
164
 
@@ -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
 
@@ -1,4 +1,5 @@
1
1
  import os
2
+ from pathlib import Path
2
3
 
3
4
  import pytest
4
5
 
@@ -20,12 +21,14 @@ def uuid_app():
20
21
 
21
22
 
22
23
  @pytest.mark.local
23
- def test_initial_checkpoint_write():
24
+ def test_initial_checkpoint_write() -> None:
24
25
  """1. Launch a few apps and write the checkpoint once a few have completed
25
26
  """
26
27
  uuid_app().result()
27
28
 
28
- cpt_dir = parsl.dfk().checkpoint()
29
+ parsl.dfk().checkpoint()
29
30
 
30
- cptpath = cpt_dir + '/tasks.pkl'
31
+ cpt_dir = Path(parsl.dfk().run_dir) / 'checkpoint'
32
+
33
+ cptpath = cpt_dir / 'tasks.pkl'
31
34
  assert os.path.exists(cptpath), f"Tasks checkpoint missing: {cptpath}"
@@ -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,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)
@@ -46,6 +46,7 @@ def test_priority_queue():
46
46
  futures[(priority, i)] = fake_task(parsl_resource_specification=spec)
47
47
 
48
48
  provider.max_blocks = 1
49
+ htex.scale_out_facade(1) # don't wait for the JSP to catch up
49
50
 
50
51
  # Wait for completion
51
52
  results = {
@@ -29,7 +29,8 @@ def make_interchange(*,
29
29
  logging_level=logging.INFO,
30
30
  manager_selector=RandomManagerSelector(),
31
31
  poll_period=10,
32
- run_id="test_run_id")
32
+ run_id="test_run_id",
33
+ _check_python_mismatch=True)
33
34
 
34
35
 
35
36
  @pytest.fixture
@@ -0,0 +1,41 @@
1
+ import parsl
2
+ from parsl.app.app import python_app
3
+
4
+
5
+ @python_app(cache=True)
6
+ def raise_exception_cache(x, cache=True):
7
+ raise RuntimeError("exception from raise_exception_cache")
8
+
9
+
10
+ @python_app(cache=False)
11
+ def raise_exception_nocache(x, cache=True):
12
+ raise RuntimeError("exception from raise_exception_nocache")
13
+
14
+
15
+ def test_python_memoization(n=2):
16
+ """Test Python memoization of exceptions, with cache=True"""
17
+ x = raise_exception_cache(0)
18
+
19
+ # wait for x to be done
20
+ x.exception()
21
+
22
+ for i in range(0, n):
23
+ fut = raise_exception_cache(0)
24
+
25
+ # check that we get back the same exception object, rather than
26
+ # a new one from a second invocation of raise_exception().
27
+ assert fut.exception() is x.exception(), "Memoized exception should have been memoized"
28
+
29
+
30
+ def test_python_no_memoization(n=2):
31
+ """Test Python non-memoization of exceptions, with cache=False"""
32
+ x = raise_exception_nocache(0)
33
+
34
+ # wait for x to be done
35
+ x.exception()
36
+
37
+ for i in range(0, n):
38
+ fut = raise_exception_nocache(0)
39
+
40
+ # check that we get back a different exception object each time
41
+ assert fut.exception() is not x.exception(), "Memoized exception should have been memoized"