parsl 2025.9.1__tar.gz → 2025.11.10__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (482) hide show
  1. parsl-2025.11.10/PKG-INFO +114 -0
  2. {parsl-2025.9.1 → parsl-2025.11.10}/README.rst +5 -2
  3. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/__init__.py +0 -4
  4. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/app/bash.py +1 -1
  5. parsl-2025.11.10/parsl/benchmark/perf.py +157 -0
  6. parsl-2025.11.10/parsl/concurrent/__init__.py +166 -0
  7. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/curvezmq.py +0 -16
  8. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/data_provider/globus.py +3 -1
  9. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/dataflow/dflow.py +106 -206
  10. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/dataflow/memoization.py +144 -31
  11. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/dataflow/states.py +5 -5
  12. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/base.py +2 -2
  13. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/execute_task.py +2 -8
  14. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/flux/executor.py +4 -6
  15. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/globus_compute.py +0 -4
  16. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/high_throughput/executor.py +86 -24
  17. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/high_throughput/interchange.py +55 -42
  18. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/high_throughput/mpi_executor.py +1 -2
  19. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/high_throughput/mpi_resource_management.py +7 -14
  20. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/high_throughput/process_worker_pool.py +32 -7
  21. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/high_throughput/zmq_pipes.py +36 -67
  22. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/radical/executor.py +2 -6
  23. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/radical/rpex_worker.py +2 -2
  24. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/taskvine/executor.py +5 -1
  25. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/threads.py +5 -2
  26. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/jobs/states.py +2 -2
  27. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/jobs/strategy.py +7 -6
  28. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/db_manager.py +8 -8
  29. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/monitoring.py +2 -2
  30. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/radios/filesystem.py +2 -1
  31. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/radios/htex.py +2 -1
  32. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/radios/multiprocessing.py +2 -1
  33. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/radios/udp.py +2 -1
  34. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/radios/udp_router.py +2 -2
  35. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/radios/zmq_router.py +2 -2
  36. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/multiprocessing.py +0 -49
  37. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/base.py +24 -37
  38. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/pbspro/pbspro.py +1 -1
  39. parsl-2025.11.10/parsl/serialize/__init__.py +13 -0
  40. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/serialize/facade.py +0 -32
  41. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/local_threads_globus.py +18 -14
  42. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/taskvine_ex.py +1 -1
  43. parsl-2025.11.10/parsl/tests/sites/test_concurrent.py +96 -0
  44. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_checkpointing/test_periodic.py +15 -9
  45. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +6 -3
  46. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_checkpointing/test_regression_233.py +0 -1
  47. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_curvezmq.py +0 -42
  48. parsl-2025.11.10/parsl/tests/test_execute_task.py +20 -0
  49. parsl-2025.11.10/parsl/tests/test_htex/test_command_concurrency_regression_1321.py +54 -0
  50. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_htex.py +36 -1
  51. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_interchange_exit_bad_registration.py +2 -2
  52. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_priority_queue.py +26 -3
  53. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_zmq_binding.py +2 -1
  54. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_mpi_apps/test_mpi_scheduler.py +18 -43
  55. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_basic.py +0 -14
  56. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_depfail_propagation.py +11 -1
  57. parsl-2025.11.10/parsl/tests/test_python_apps/test_exception.py +19 -0
  58. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_garbage_collect.py +1 -6
  59. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_memoize_2.py +11 -1
  60. parsl-2025.11.10/parsl/tests/test_python_apps/test_memoize_exception.py +41 -0
  61. parsl-2025.11.10/parsl/tests/test_regression/test_3874.py +47 -0
  62. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_scaling/test_regression_3696_oscillation.py +1 -0
  63. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_staging/test_staging_globus.py +2 -2
  64. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/unit/test_globus_compute_executor.py +11 -2
  65. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/utils.py +8 -3
  66. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/version.py +1 -1
  67. parsl-2025.11.10/parsl.egg-info/PKG-INFO +114 -0
  68. {parsl-2025.9.1 → parsl-2025.11.10}/parsl.egg-info/SOURCES.txt +4 -9
  69. {parsl-2025.9.1 → parsl-2025.11.10}/parsl.egg-info/requires.txt +4 -1
  70. {parsl-2025.9.1 → parsl-2025.11.10}/requirements.txt +0 -1
  71. {parsl-2025.9.1 → parsl-2025.11.10}/setup.py +2 -2
  72. parsl-2025.9.1/PKG-INFO +0 -35
  73. parsl-2025.9.1/parsl/benchmark/perf.py +0 -101
  74. parsl-2025.9.1/parsl/concurrent/__init__.py +0 -85
  75. parsl-2025.9.1/parsl/serialize/__init__.py +0 -16
  76. parsl-2025.9.1/parsl/tests/configs/local_threads_checkpoint_periodic.py +0 -11
  77. parsl-2025.9.1/parsl/tests/configs/local_threads_no_cache.py +0 -11
  78. parsl-2025.9.1/parsl/tests/site_tests/test_provider.py +0 -88
  79. parsl-2025.9.1/parsl/tests/site_tests/test_site.py +0 -70
  80. parsl-2025.9.1/parsl/tests/sites/test_concurrent.py +0 -48
  81. parsl-2025.9.1/parsl/tests/test_aalst_patterns.py +0 -474
  82. parsl-2025.9.1/parsl/tests/test_docs/test_workflow2.py +0 -42
  83. parsl-2025.9.1/parsl/tests/test_error_handling/test_rand_fail.py +0 -171
  84. parsl-2025.9.1/parsl/tests/test_execute_task.py +0 -29
  85. parsl-2025.9.1/parsl/tests/test_regression/test_854.py +0 -62
  86. parsl-2025.9.1/parsl/tests/test_serialization/test_pack_resource_spec.py +0 -23
  87. parsl-2025.9.1/parsl.egg-info/PKG-INFO +0 -35
  88. {parsl-2025.9.1 → parsl-2025.11.10}/LICENSE +0 -0
  89. {parsl-2025.9.1 → parsl-2025.11.10}/MANIFEST.in +0 -0
  90. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/addresses.py +0 -0
  91. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/app/__init__.py +0 -0
  92. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/app/app.py +0 -0
  93. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/app/errors.py +0 -0
  94. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/app/futures.py +0 -0
  95. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/app/python.py +0 -0
  96. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/benchmark/__init__.py +0 -0
  97. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/config.py +0 -0
  98. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/ASPIRE1.py +0 -0
  99. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/Azure.py +0 -0
  100. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/__init__.py +0 -0
  101. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/anvil.py +0 -0
  102. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/bridges.py +0 -0
  103. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/cc_in2p3.py +0 -0
  104. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/delta.py +0 -0
  105. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/ec2.py +0 -0
  106. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/expanse.py +0 -0
  107. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/frontera.py +0 -0
  108. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/gc_multisite.py +0 -0
  109. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/gc_tutorial.py +0 -0
  110. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/htex_local.py +0 -0
  111. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/illinoiscluster.py +0 -0
  112. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/improv.py +0 -0
  113. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/kubernetes.py +0 -0
  114. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/local_threads.py +0 -0
  115. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/midway.py +0 -0
  116. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/osg.py +0 -0
  117. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/polaris.py +0 -0
  118. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/stampede2.py +0 -0
  119. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/summit.py +0 -0
  120. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/toss3_llnl.py +0 -0
  121. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/vineex_local.py +0 -0
  122. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/configs/wqex_local.py +0 -0
  123. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/data_provider/__init__.py +0 -0
  124. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/data_provider/data_manager.py +0 -0
  125. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/data_provider/file_noop.py +0 -0
  126. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/data_provider/files.py +0 -0
  127. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/data_provider/ftp.py +0 -0
  128. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/data_provider/http.py +0 -0
  129. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/data_provider/rsync.py +0 -0
  130. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/data_provider/staging.py +0 -0
  131. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/data_provider/zip.py +0 -0
  132. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/dataflow/__init__.py +0 -0
  133. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/dataflow/dependency_resolvers.py +0 -0
  134. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/dataflow/errors.py +0 -0
  135. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/dataflow/futures.py +0 -0
  136. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/dataflow/rundirs.py +0 -0
  137. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/dataflow/taskrecord.py +0 -0
  138. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/errors.py +0 -0
  139. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/__init__.py +0 -0
  140. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/errors.py +0 -0
  141. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/flux/__init__.py +0 -0
  142. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/flux/execute_parsl_task.py +0 -0
  143. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/flux/flux_instance_manager.py +0 -0
  144. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/high_throughput/__init__.py +0 -0
  145. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/high_throughput/errors.py +0 -0
  146. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/high_throughput/manager_record.py +0 -0
  147. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/high_throughput/manager_selector.py +0 -0
  148. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/high_throughput/monitoring_info.py +0 -0
  149. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/high_throughput/mpi_prefix_composer.py +0 -0
  150. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/high_throughput/probe.py +0 -0
  151. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/radical/__init__.py +0 -0
  152. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/radical/rpex_resources.py +0 -0
  153. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/status_handling.py +0 -0
  154. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/taskvine/__init__.py +0 -0
  155. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/taskvine/errors.py +0 -0
  156. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/taskvine/exec_parsl_function.py +0 -0
  157. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/taskvine/factory.py +0 -0
  158. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/taskvine/factory_config.py +0 -0
  159. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/taskvine/manager.py +0 -0
  160. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/taskvine/manager_config.py +0 -0
  161. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/taskvine/utils.py +0 -0
  162. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/workqueue/__init__.py +0 -0
  163. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/workqueue/errors.py +0 -0
  164. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/workqueue/exec_parsl_function.py +0 -0
  165. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/workqueue/executor.py +0 -0
  166. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/workqueue/parsl_coprocess.py +0 -0
  167. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
  168. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/jobs/__init__.py +0 -0
  169. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/jobs/error_handlers.py +0 -0
  170. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/jobs/errors.py +0 -0
  171. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/jobs/job_status_poller.py +0 -0
  172. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/launchers/__init__.py +0 -0
  173. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/launchers/base.py +0 -0
  174. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/launchers/errors.py +0 -0
  175. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/launchers/launchers.py +0 -0
  176. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/log_utils.py +0 -0
  177. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/__init__.py +0 -0
  178. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/errors.py +0 -0
  179. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/message_type.py +0 -0
  180. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/queries/__init__.py +0 -0
  181. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/queries/pandas.py +0 -0
  182. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/radios/__init__.py +0 -0
  183. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/radios/base.py +0 -0
  184. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/radios/filesystem_router.py +0 -0
  185. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/radios/zmq.py +0 -0
  186. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/remote.py +0 -0
  187. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/types.py +0 -0
  188. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/__init__.py +0 -0
  189. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/app.py +0 -0
  190. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/models.py +0 -0
  191. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/plots/__init__.py +0 -0
  192. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
  193. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
  194. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/plots/default/workflow_plots.py +0 -0
  195. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +0 -0
  196. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
  197. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
  198. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/templates/app.html +0 -0
  199. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/templates/dag.html +0 -0
  200. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/templates/error.html +0 -0
  201. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/templates/layout.html +0 -0
  202. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
  203. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/templates/task.html +0 -0
  204. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/templates/workflow.html +0 -0
  205. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
  206. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/utils.py +0 -0
  207. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/version.py +0 -0
  208. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/monitoring/visualization/views.py +0 -0
  209. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/process_loggers.py +0 -0
  210. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/__init__.py +0 -0
  211. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/aws/__init__.py +0 -0
  212. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/aws/aws.py +0 -0
  213. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/aws/template.py +0 -0
  214. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/azure/__init__.py +0 -0
  215. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/azure/azure.py +0 -0
  216. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/azure/template.py +0 -0
  217. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/cluster_provider.py +0 -0
  218. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/condor/__init__.py +0 -0
  219. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/condor/condor.py +0 -0
  220. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/condor/template.py +0 -0
  221. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/errors.py +0 -0
  222. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/googlecloud/__init__.py +0 -0
  223. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/googlecloud/googlecloud.py +0 -0
  224. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/grid_engine/__init__.py +0 -0
  225. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/grid_engine/grid_engine.py +0 -0
  226. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/grid_engine/template.py +0 -0
  227. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/kubernetes/__init__.py +0 -0
  228. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/kubernetes/kube.py +0 -0
  229. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/kubernetes/template.py +0 -0
  230. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/local/__init__.py +0 -0
  231. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/local/local.py +0 -0
  232. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/lsf/__init__.py +0 -0
  233. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/lsf/lsf.py +0 -0
  234. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/lsf/template.py +0 -0
  235. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/pbspro/__init__.py +0 -0
  236. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/pbspro/template.py +0 -0
  237. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/slurm/__init__.py +0 -0
  238. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/slurm/slurm.py +0 -0
  239. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/slurm/template.py +0 -0
  240. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/torque/__init__.py +0 -0
  241. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/torque/template.py +0 -0
  242. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/providers/torque/torque.py +0 -0
  243. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/py.typed +0 -0
  244. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/serialize/base.py +0 -0
  245. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/serialize/concretes.py +0 -0
  246. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/serialize/errors.py +0 -0
  247. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/serialize/proxystore.py +0 -0
  248. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/__init__.py +0 -0
  249. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/callables_helper.py +0 -0
  250. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/__init__.py +0 -0
  251. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/azure_single_node.py +0 -0
  252. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/bluewaters.py +0 -0
  253. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/bridges.py +0 -0
  254. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/cc_in2p3.py +0 -0
  255. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/comet.py +0 -0
  256. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/ec2_single_node.py +0 -0
  257. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/ec2_spot.py +0 -0
  258. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/flux_local.py +0 -0
  259. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/frontera.py +0 -0
  260. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/globus_compute.py +0 -0
  261. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/htex_local.py +0 -0
  262. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/htex_local_alternate.py +0 -0
  263. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/htex_local_intask_staging.py +0 -0
  264. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/htex_local_rsync_staging.py +0 -0
  265. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/local_radical.py +0 -0
  266. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/local_radical_mpi.py +0 -0
  267. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/local_threads.py +0 -0
  268. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
  269. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
  270. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
  271. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
  272. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
  273. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/midway.py +0 -0
  274. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/nscc_singapore.py +0 -0
  275. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/osg_htex.py +0 -0
  276. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/petrelkube.py +0 -0
  277. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/slurm_local.py +0 -0
  278. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/summit.py +0 -0
  279. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/user_opts.py +0 -0
  280. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/configs/workqueue_ex.py +0 -0
  281. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/conftest.py +0 -0
  282. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/integration/__init__.py +0 -0
  283. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/integration/latency.py +0 -0
  284. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/integration/test_apps/__init__.py +0 -0
  285. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
  286. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/integration/test_stress/__init__.py +0 -0
  287. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
  288. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
  289. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/manual_tests/__init__.py +0 -0
  290. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/manual_tests/htex_local.py +0 -0
  291. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/manual_tests/test_basic.py +0 -0
  292. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/manual_tests/test_log_filter.py +0 -0
  293. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/manual_tests/test_memory_limits.py +0 -0
  294. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/manual_tests/test_regression_220.py +0 -0
  295. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/manual_tests/test_worker_count.py +0 -0
  296. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/site_tests/__init__.py +0 -0
  297. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/site_tests/site_config_selector.py +0 -0
  298. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/sites/__init__.py +0 -0
  299. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/sites/test_affinity.py +0 -0
  300. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/sites/test_dynamic_executor.py +0 -0
  301. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/sites/test_ec2.py +0 -0
  302. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/sites/test_launchers.py +0 -0
  303. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/sites/test_mpi/__init__.py +0 -0
  304. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/sites/test_worker_info.py +0 -0
  305. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_bash_apps/__init__.py +0 -0
  306. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
  307. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_bash_apps/test_basic.py +0 -0
  308. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
  309. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_bash_apps/test_inputs_default.py +0 -0
  310. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
  311. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -0
  312. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_bash_apps/test_memoize.py +0 -0
  313. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
  314. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
  315. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_bash_apps/test_multiline.py +0 -0
  316. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_bash_apps/test_pipeline.py +0 -0
  317. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_bash_apps/test_std_uri.py +0 -0
  318. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_bash_apps/test_stdout.py +0 -0
  319. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_callables.py +0 -0
  320. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_checkpointing/__init__.py +0 -0
  321. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
  322. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
  323. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
  324. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_checkpointing/test_task_exit.py +0 -0
  325. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_docs/__init__.py +0 -0
  326. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_docs/test_from_slides.py +0 -0
  327. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_docs/test_kwargs.py +0 -0
  328. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
  329. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_docs/test_workflow1.py +0 -0
  330. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_docs/test_workflow4.py +0 -0
  331. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_error_handling/__init__.py +0 -0
  332. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_error_handling/test_fail.py +0 -0
  333. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_error_handling/test_python_walltime.py +0 -0
  334. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_error_handling/test_resource_spec.py +0 -0
  335. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_error_handling/test_retries.py +0 -0
  336. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
  337. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
  338. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
  339. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
  340. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_flowcontrol/__init__.py +0 -0
  341. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_flux.py +0 -0
  342. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/__init__.py +0 -0
  343. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_basic.py +0 -0
  344. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_block_manager_selector_unit.py +0 -0
  345. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_command_client_timeout.py +0 -0
  346. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_connected_blocks.py +0 -0
  347. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_cpu_affinity_explicit.py +0 -0
  348. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_disconnected_blocks.py +0 -0
  349. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_disconnected_blocks_failing_provider.py +0 -0
  350. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_drain.py +0 -0
  351. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_manager_failure.py +0 -0
  352. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_manager_selector_by_block.py +0 -0
  353. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_managers_command.py +0 -0
  354. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_missing_worker.py +0 -0
  355. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_multiple_disconnected_blocks.py +0 -0
  356. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_resource_spec_validation.py +0 -0
  357. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_htex/test_worker_failure.py +0 -0
  358. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_monitoring/__init__.py +0 -0
  359. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_monitoring/test_app_names.py +0 -0
  360. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_monitoring/test_basic.py +0 -0
  361. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
  362. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_monitoring/test_exit_helper.py +0 -0
  363. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_monitoring/test_htex_fuzz_zmq.py +0 -0
  364. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +0 -0
  365. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_monitoring/test_incomplete_futures.py +0 -0
  366. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_monitoring/test_memoization_representation.py +0 -0
  367. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_monitoring/test_radio_filesystem.py +0 -0
  368. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_monitoring/test_radio_multiprocessing.py +0 -0
  369. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_monitoring/test_radio_udp.py +0 -0
  370. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_monitoring/test_radio_zmq.py +0 -0
  371. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_monitoring/test_stdouterr.py +0 -0
  372. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
  373. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_mpi_apps/__init__.py +0 -0
  374. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_mpi_apps/test_bad_mpi_config.py +0 -0
  375. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +0 -0
  376. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_mpi_apps/test_mpi_prefix.py +0 -0
  377. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_mpi_apps/test_mpiex.py +0 -0
  378. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_mpi_apps/test_resource_spec.py +0 -0
  379. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_providers/__init__.py +0 -0
  380. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_providers/test_kubernetes_provider.py +0 -0
  381. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_providers/test_local_provider.py +0 -0
  382. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_providers/test_pbspro_template.py +0 -0
  383. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_providers/test_slurm_instantiate.py +0 -0
  384. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_providers/test_slurm_template.py +0 -0
  385. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_providers/test_submiterror_deprecation.py +0 -0
  386. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/__init__.py +0 -0
  387. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
  388. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_context_manager.py +0 -0
  389. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_dep_standard_futures.py +0 -0
  390. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
  391. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_dependencies_deep.py +0 -0
  392. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_fail.py +0 -0
  393. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
  394. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
  395. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_futures.py +0 -0
  396. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
  397. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_inputs_default.py +0 -0
  398. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_join.py +0 -0
  399. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_lifted.py +0 -0
  400. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_mapred.py +0 -0
  401. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
  402. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
  403. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +0 -0
  404. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
  405. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
  406. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_outputs.py +0 -0
  407. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_overview.py +0 -0
  408. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_pipeline.py +0 -0
  409. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_pluggable_future_resolution.py +0 -0
  410. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_simple.py +0 -0
  411. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_timeout.py +0 -0
  412. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_python_apps/test_type5.py +0 -0
  413. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_radical/__init__.py +0 -0
  414. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_radical/test_mpi_funcs.py +0 -0
  415. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_regression/__init__.py +0 -0
  416. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_regression/test_1480.py +0 -0
  417. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +0 -0
  418. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_regression/test_1653.py +0 -0
  419. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_regression/test_221.py +0 -0
  420. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_regression/test_226.py +0 -0
  421. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_regression/test_2652.py +0 -0
  422. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_regression/test_69a.py +0 -0
  423. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_regression/test_97_parallelism_0.py +0 -0
  424. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_regression/test_98.py +0 -0
  425. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_scaling/__init__.py +0 -0
  426. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_scaling/test_block_error_handler.py +0 -0
  427. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_scaling/test_regression_1621.py +0 -0
  428. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_scaling/test_regression_3568_scaledown_vs_MISSING.py +0 -0
  429. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_scaling/test_scale_down.py +0 -0
  430. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +0 -0
  431. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +0 -0
  432. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_scaling/test_shutdown_scalein.py +0 -0
  433. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_scaling/test_worker_interchange_bad_messages_3262.py +0 -0
  434. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_serialization/__init__.py +0 -0
  435. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_serialization/test_2555_caching_deserializer.py +0 -0
  436. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_serialization/test_3495_deserialize_managerlost.py +0 -0
  437. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_serialization/test_basic.py +0 -0
  438. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_serialization/test_htex_code_cache.py +0 -0
  439. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_serialization/test_proxystore_configured.py +0 -0
  440. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_serialization/test_proxystore_impl.py +0 -0
  441. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_shutdown/__init__.py +0 -0
  442. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_shutdown/test_kill_monitoring.py +0 -0
  443. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_staging/__init__.py +0 -0
  444. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_staging/staging_provider.py +0 -0
  445. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_staging/test_1316.py +0 -0
  446. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_staging/test_docs_1.py +0 -0
  447. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_staging/test_docs_2.py +0 -0
  448. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
  449. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_staging/test_file.py +0 -0
  450. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_staging/test_file_apps.py +0 -0
  451. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_staging/test_file_staging.py +0 -0
  452. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_staging/test_output_chain_filenames.py +0 -0
  453. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
  454. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
  455. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_staging/test_staging_https.py +0 -0
  456. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_staging/test_staging_stdout.py +0 -0
  457. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_staging/test_zip_in.py +0 -0
  458. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_staging/test_zip_out.py +0 -0
  459. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_staging/test_zip_to_zip.py +0 -0
  460. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_summary.py +0 -0
  461. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_thread_parallelism.py +0 -0
  462. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_threads/__init__.py +0 -0
  463. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_threads/test_configs.py +0 -0
  464. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
  465. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_utils/__init__.py +0 -0
  466. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_utils/test_execute_wait.py +0 -0
  467. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_utils/test_logutils.py +0 -0
  468. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_utils/test_representation_mixin.py +0 -0
  469. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/test_utils/test_sanitize_dns.py +0 -0
  470. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/unit/__init__.py +0 -0
  471. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/unit/test_address.py +0 -0
  472. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/unit/test_file.py +0 -0
  473. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/unit/test_usage_tracking.py +0 -0
  474. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/tests/utils.py +0 -0
  475. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/usage_tracking/__init__.py +0 -0
  476. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/usage_tracking/api.py +0 -0
  477. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/usage_tracking/levels.py +0 -0
  478. {parsl-2025.9.1 → parsl-2025.11.10}/parsl/usage_tracking/usage.py +0 -0
  479. {parsl-2025.9.1 → parsl-2025.11.10}/parsl.egg-info/dependency_links.txt +0 -0
  480. {parsl-2025.9.1 → parsl-2025.11.10}/parsl.egg-info/entry_points.txt +0 -0
  481. {parsl-2025.9.1 → parsl-2025.11.10}/parsl.egg-info/top_level.txt +0 -0
  482. {parsl-2025.9.1 → parsl-2025.11.10}/setup.cfg +0 -0
@@ -0,0 +1,114 @@
1
+ Metadata-Version: 2.4
2
+ Name: parsl
3
+ Version: 2025.11.10
4
+ Summary: Simple data dependent workflows in Python
5
+ Home-page: https://github.com/Parsl/parsl
6
+ Download-URL: https://github.com/Parsl/parsl/archive/2025.11.10.tar.gz
7
+ Author: The Parsl Team
8
+ Author-email: parsl@googlegroups.com
9
+ License: Apache 2.0
10
+ Keywords: Workflows,Scientific computing
11
+ Classifier: Development Status :: 5 - Production/Stable
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: Apache Software License
14
+ Classifier: Programming Language :: Python :: 3.10
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Requires-Python: >=3.10.0
18
+ License-File: LICENSE
19
+ Requires-Dist: pyzmq>=17.1.2
20
+ Requires-Dist: typeguard!=3.*,<5,>=2.10
21
+ Requires-Dist: typing-extensions<5,>=4.6
22
+ Requires-Dist: dill
23
+ Requires-Dist: tblib
24
+ Requires-Dist: requests
25
+ Requires-Dist: sortedcontainers
26
+ Requires-Dist: psutil>=5.5.1
27
+ Requires-Dist: setproctitle
28
+ Requires-Dist: filelock<4,>=3.13
29
+ Provides-Extra: monitoring
30
+ Requires-Dist: sqlalchemy<2.1,>=2; extra == "monitoring"
31
+ Provides-Extra: visualization
32
+ Requires-Dist: pydot>=1.4.2; extra == "visualization"
33
+ Requires-Dist: networkx<3.3,>=3.2; extra == "visualization"
34
+ Requires-Dist: Flask>=1.0.2; extra == "visualization"
35
+ Requires-Dist: flask_sqlalchemy; extra == "visualization"
36
+ Requires-Dist: pandas<3,>=2.2; extra == "visualization"
37
+ Requires-Dist: plotly; extra == "visualization"
38
+ Requires-Dist: python-daemon; extra == "visualization"
39
+ Provides-Extra: aws
40
+ Requires-Dist: boto3; extra == "aws"
41
+ Provides-Extra: kubernetes
42
+ Requires-Dist: kubernetes; extra == "kubernetes"
43
+ Provides-Extra: docs
44
+ Requires-Dist: ipython<=8.6.0; extra == "docs"
45
+ Requires-Dist: nbsphinx; extra == "docs"
46
+ Requires-Dist: sphinx<8,>=7.4; extra == "docs"
47
+ Requires-Dist: sphinx_rtd_theme; extra == "docs"
48
+ Provides-Extra: google-cloud
49
+ Requires-Dist: google-auth; extra == "google-cloud"
50
+ Requires-Dist: google-api-python-client; extra == "google-cloud"
51
+ Provides-Extra: gssapi
52
+ Requires-Dist: python-gssapi; extra == "gssapi"
53
+ Provides-Extra: azure
54
+ Requires-Dist: azure<=4; extra == "azure"
55
+ Requires-Dist: msrestazure; extra == "azure"
56
+ Provides-Extra: workqueue
57
+ Requires-Dist: work_queue; extra == "workqueue"
58
+ Provides-Extra: flux
59
+ Requires-Dist: pyyaml; extra == "flux"
60
+ Requires-Dist: cffi; extra == "flux"
61
+ Requires-Dist: jsonschema; extra == "flux"
62
+ Provides-Extra: proxystore
63
+ Requires-Dist: proxystore; extra == "proxystore"
64
+ Provides-Extra: radical-pilot
65
+ Requires-Dist: radical.pilot==1.90; extra == "radical-pilot"
66
+ Requires-Dist: radical.utils==1.90; extra == "radical-pilot"
67
+ Provides-Extra: globus-compute
68
+ Requires-Dist: globus_compute_sdk>=2.34.0; extra == "globus-compute"
69
+ Provides-Extra: globus-transfer
70
+ Requires-Dist: globus-sdk; extra == "globus-transfer"
71
+ Provides-Extra: all
72
+ Requires-Dist: sqlalchemy<2.1,>=2; extra == "all"
73
+ Requires-Dist: pydot>=1.4.2; extra == "all"
74
+ Requires-Dist: networkx<3.3,>=3.2; extra == "all"
75
+ Requires-Dist: Flask>=1.0.2; extra == "all"
76
+ Requires-Dist: flask_sqlalchemy; extra == "all"
77
+ Requires-Dist: pandas<3,>=2.2; extra == "all"
78
+ Requires-Dist: plotly; extra == "all"
79
+ Requires-Dist: python-daemon; extra == "all"
80
+ Requires-Dist: boto3; extra == "all"
81
+ Requires-Dist: kubernetes; extra == "all"
82
+ Requires-Dist: ipython<=8.6.0; extra == "all"
83
+ Requires-Dist: nbsphinx; extra == "all"
84
+ Requires-Dist: sphinx<8,>=7.4; extra == "all"
85
+ Requires-Dist: sphinx_rtd_theme; extra == "all"
86
+ Requires-Dist: google-auth; extra == "all"
87
+ Requires-Dist: google-api-python-client; extra == "all"
88
+ Requires-Dist: python-gssapi; extra == "all"
89
+ Requires-Dist: azure<=4; extra == "all"
90
+ Requires-Dist: msrestazure; extra == "all"
91
+ Requires-Dist: work_queue; extra == "all"
92
+ Requires-Dist: pyyaml; extra == "all"
93
+ Requires-Dist: cffi; extra == "all"
94
+ Requires-Dist: jsonschema; extra == "all"
95
+ Requires-Dist: proxystore; extra == "all"
96
+ Requires-Dist: radical.pilot==1.90; extra == "all"
97
+ Requires-Dist: radical.utils==1.90; extra == "all"
98
+ Requires-Dist: globus_compute_sdk>=2.34.0; extra == "all"
99
+ Requires-Dist: globus-sdk; extra == "all"
100
+ Dynamic: author
101
+ Dynamic: author-email
102
+ Dynamic: classifier
103
+ Dynamic: description
104
+ Dynamic: download-url
105
+ Dynamic: home-page
106
+ Dynamic: keywords
107
+ Dynamic: license
108
+ Dynamic: license-file
109
+ Dynamic: provides-extra
110
+ Dynamic: requires-dist
111
+ Dynamic: requires-python
112
+ Dynamic: summary
113
+
114
+ Simple parallel workflows system for Python
@@ -1,6 +1,6 @@
1
1
  Parsl - Parallel Scripting Library
2
2
  ==================================
3
- |licence| |docs| |NSF-1550588| |NSF-1550476| |NSF-1550562| |NSF-1550528| |NumFOCUS| |CZI-EOSS|
3
+ |licence| |docs| |NSF-1550588| |NSF-1550476| |NSF-1550562| |NSF-1550528| |NumFOCUS| |CZI-EOSS| |paper|
4
4
 
5
5
  Parsl extends parallelism in Python beyond a single computer.
6
6
 
@@ -67,6 +67,9 @@ then explore the `parallel computing patterns <https://parsl.readthedocs.io/en/s
67
67
  .. |NumFOCUS| image:: https://img.shields.io/badge/powered%20by-NumFOCUS-orange.svg?style=flat&colorA=E1523D&colorB=007D8A
68
68
  :target: https://numfocus.org
69
69
  :alt: Powered by NumFOCUS
70
+ .. |paper| image:: https://img.shields.io/badge/Software_DOI-10.1145/3307681.3325400-blue
71
+ :target: https://doi.org/10.1145/3307681.3325400
72
+ :alt: Conference proceedings paper
70
73
 
71
74
 
72
75
  Quickstart
@@ -120,7 +123,7 @@ For Developers
120
123
  Requirements
121
124
  ============
122
125
 
123
- Parsl is supported in Python 3.9+. Requirements can be found `here <requirements.txt>`_. Requirements for running tests can be found `here <test-requirements.txt>`_.
126
+ Parsl is supported in Python 3.10+. Requirements can be found `here <requirements.txt>`_. Requirements for running tests can be found `here <test-requirements.txt>`_.
124
127
 
125
128
  Code of Conduct
126
129
  ===============
@@ -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
 
@@ -88,7 +88,7 @@ def remote_side_bash_executor(func, *args, **kwargs):
88
88
  raise pe.AppTimeout(f"App {func_name} exceeded walltime: {timeout} seconds")
89
89
 
90
90
  except Exception as e:
91
- raise pe.AppException(f"App {func_name} caught exception with returncode: {returncode}", e)
91
+ raise pe.AppException(f"App {func_name} caught exception", e)
92
92
 
93
93
  if returncode != 0:
94
94
  raise pe.BashExitFailure(func_name, proc.returncode)
@@ -0,0 +1,157 @@
1
+ import argparse
2
+ import concurrent.futures
3
+ import importlib
4
+ import time
5
+ from typing import Any, Dict, Literal
6
+
7
+ import parsl
8
+ from parsl.dataflow.dflow import DataFlowKernel
9
+ from parsl.errors import InternalConsistencyError
10
+
11
+ VALID_NAMED_ITERATION_MODES = ("estimate", "exponential")
12
+
13
+ min_iterations = 2
14
+
15
+
16
+ # TODO: factor with conftest.py where this is copy/pasted from?
17
+ def load_dfk_from_config(filename: str) -> DataFlowKernel:
18
+ spec = importlib.util.spec_from_file_location('', filename)
19
+
20
+ if spec is None:
21
+ raise RuntimeError("Could not import configuration")
22
+
23
+ module = importlib.util.module_from_spec(spec)
24
+
25
+ if spec.loader is None:
26
+ raise RuntimeError("Could not load configuration")
27
+
28
+ spec.loader.exec_module(module)
29
+
30
+ module = importlib.util.module_from_spec(spec)
31
+ spec.loader.exec_module(module)
32
+
33
+ if hasattr(module, 'config'):
34
+ return parsl.load(module.config)
35
+ elif hasattr(module, 'fresh_config'):
36
+ return parsl.load(module.fresh_config())
37
+ else:
38
+ raise RuntimeError("Config module does not define config or fresh_config")
39
+
40
+
41
+ @parsl.python_app
42
+ def app(extra_payload: Any, parsl_resource_specification: Dict = {}) -> int:
43
+ return 7
44
+
45
+
46
+ def performance(*, resources: dict, target_t: float, args_extra_size: int, iterate_mode: str | list[int]) -> None:
47
+
48
+ delta_t: float
49
+
50
+ iteration = 1
51
+
52
+ args_extra_payload = "x" * args_extra_size
53
+
54
+ if isinstance(iterate_mode, list):
55
+ n = iterate_mode[0]
56
+ else:
57
+ n = 10
58
+
59
+ iterate = True
60
+
61
+ while iterate:
62
+ print(f"==== Iteration {iteration} ====")
63
+ print(f"Will run {n} tasks")
64
+ start_t = time.time()
65
+
66
+ fs = []
67
+ print("Submitting tasks / invoking apps")
68
+ for _ in range(n):
69
+ fs.append(app(args_extra_payload, parsl_resource_specification=resources))
70
+
71
+ submitted_t = time.time()
72
+ print(f"All {n} tasks submitted ... waiting for completion")
73
+ print(f"Submission took {submitted_t - start_t:.3f} seconds = {n / (submitted_t - start_t):.3f} tasks/second")
74
+
75
+ for f in concurrent.futures.as_completed(fs):
76
+ assert f.result() == 7
77
+
78
+ end_t = time.time()
79
+
80
+ delta_t = end_t - start_t
81
+
82
+ rate = n / delta_t
83
+
84
+ print(f"Runtime: actual {delta_t:.3f}s vs target {target_t}s")
85
+ print(f"Tasks per second: {rate:.3f}")
86
+
87
+ iteration += 1
88
+
89
+ # decide upon next iteration
90
+
91
+ match iterate_mode:
92
+ case "estimate":
93
+ n = max(1, int(target_t * rate))
94
+ iterate = delta_t < (0.75 * target_t) or iteration <= min_iterations
95
+ case "exponential":
96
+ n = int(n * 2)
97
+ iterate = delta_t < target_t or iteration <= min_iterations
98
+ case seq if isinstance(seq, list) and iteration <= len(seq):
99
+ n = seq[iteration - 1]
100
+ iterate = True
101
+ case seq if isinstance(seq, list):
102
+ iterate = False
103
+ case _:
104
+ raise InternalConsistencyError(f"Bad iterate mode {iterate_mode} - should have been validated at arg parse time")
105
+
106
+
107
+ def validate_int_list(v: str) -> list[int] | Literal[False]:
108
+ try:
109
+ return list(map(int, v.split(",")))
110
+ except ValueError:
111
+ return False
112
+
113
+
114
+ def iteration_mode(v: str) -> str | list[int]:
115
+ match v:
116
+ case s if s in VALID_NAMED_ITERATION_MODES:
117
+ return s
118
+ case _ if seq := validate_int_list(v):
119
+ return seq
120
+ case _:
121
+ raise argparse.ArgumentTypeError(f"Invalid iteration mode: {v}")
122
+
123
+
124
+ def cli_run() -> None:
125
+ parser = argparse.ArgumentParser(
126
+ prog="parsl-perf",
127
+ description="Measure performance of Parsl configurations",
128
+ epilog="""
129
+ Example usage: python -m parsl.benchmark.perf --config parsl/tests/configs/workqueue_blocks.py --resources '{"cores":1, "memory":0, "disk":0}'
130
+ """)
131
+
132
+ parser.add_argument("--config", required=True, help="path to Python file that defines a configuration")
133
+ parser.add_argument("--resources", metavar="EXPR", help="parsl_resource_specification dictionary")
134
+ parser.add_argument("--time", metavar="SECONDS", help="target number of seconds for an iteration", default=120, type=float)
135
+ parser.add_argument("--argsize", metavar="BYTES", help="extra bytes to add into app invocation arguments", default=0, type=int)
136
+ parser.add_argument("--version", action="version", version=f"parsl-perf from Parsl {parsl.__version__}")
137
+ parser.add_argument("--iterate",
138
+ metavar="MODE",
139
+ help="Iteration mode: " + ", ".join(VALID_NAMED_ITERATION_MODES) + ", or sequence of explicit sizes",
140
+ type=iteration_mode,
141
+ default="estimate")
142
+
143
+ args = parser.parse_args()
144
+
145
+ if args.resources:
146
+ resources = eval(args.resources)
147
+ else:
148
+ resources = {}
149
+
150
+ with load_dfk_from_config(args.config):
151
+ performance(resources=resources, target_t=args.time, args_extra_size=args.argsize, iterate_mode=args.iterate)
152
+ print("Tests complete - leaving DFK block")
153
+ print("The end")
154
+
155
+
156
+ if __name__ == "__main__":
157
+ cli_run()
@@ -0,0 +1,166 @@
1
+ """Interfaces modeled after Python's `concurrent library <https://docs.python.org/3/library/concurrent.html>`_"""
2
+ import time
3
+ from concurrent.futures import Executor
4
+ from contextlib import AbstractContextManager
5
+ from typing import Callable, Dict, Iterable, Iterator, Literal, Optional
6
+ from warnings import warn
7
+
8
+ from parsl import Config, DataFlowKernel, load
9
+ from parsl.app.python import PythonApp
10
+
11
+
12
+ class ParslPoolExecutor(Executor, AbstractContextManager):
13
+ """An executor that uses a pool of workers managed by Parsl
14
+
15
+ Works just like a :class:`~concurrent.futures.ProcessPoolExecutor` except that tasks
16
+ are distributed across workers that can be on different machines.
17
+
18
+ Create a new executor using one of two methods:
19
+
20
+ 1. Supplying a Parsl :class:`~parsl.Config` that defines how to create new workers.
21
+ The executor will start a new Parsl Data Flow Kernel (DFK) when it is entered as a context manager.
22
+
23
+ 2. Supplying an already-started Parsl :class:`~parsl.DataFlowKernel` (DFK).
24
+ The executor assumes you will start and stop the Parsl DFK outside the Executor.
25
+
26
+ The futures returned by :meth:`submit` and :meth:`map` are Parsl futures and will work
27
+ with the same function chaining mechanisms as when using Parsl with decorators.
28
+
29
+ .. code-block:: python
30
+
31
+ def f(x):
32
+ return x + 1
33
+
34
+ @python_app
35
+ def parity(x):
36
+ return 'odd' if x % 2 == 1 else 'even'
37
+
38
+ with ParslPoolExecutor(config=my_parsl_config) as executor:
39
+ future_1 = executor.submit(f, 1)
40
+ assert parity(future_1) == 'even' # Function chaining, as expected
41
+
42
+ future_2 = executor.submit(f, future_1)
43
+ assert future_2.result() == 3 # Chaining works with `submit` too
44
+
45
+ Parsl does not support canceling tasks. The :meth:`map` method does not cancel work
46
+ when one member of the run fails or a timeout is reached
47
+ and :meth:`shutdown` does not cancel work on completion.
48
+ """
49
+
50
+ def __init__(self, config: Config | None = None, dfk: DataFlowKernel | None = None, executors: Literal['all'] | list[str] = 'all'):
51
+ """Create the executor
52
+
53
+ Args:
54
+ config: Configuration for the Parsl Data Flow Kernel (DFK)
55
+ dfk: DataFlowKernel of an already-started parsl
56
+ executors: List of executors to use for supplied functions
57
+ """
58
+ if (config is not None) and (dfk is not None):
59
+ raise ValueError('Specify only one of config or dfk')
60
+ if (config is None) and (dfk is None):
61
+ raise ValueError('Must specify one of config or dfk')
62
+ self._config = config
63
+ self._app_cache: Dict[Callable, PythonApp] = {} # Cache specific to this instance: https://stackoverflow.com/questions/33672412
64
+ self._dfk = dfk
65
+ self.executors = executors
66
+
67
+ # Start workers immediately
68
+ if self._config is not None:
69
+ self._dfk = load(self._config)
70
+
71
+ def __exit__(self, exc_type, exc_val, exc_tb):
72
+ if self._dfk is None: # Nothing has been started, do nothing
73
+ return
74
+ elif self._config is not None: # The executors are being managed by this class, shut them down
75
+ self.shutdown(wait=True)
76
+ return
77
+ else: # The DFK is managed elsewhere, do nothing
78
+ return
79
+
80
+ @property
81
+ def app_count(self):
82
+ """Number of functions currently registered with the executor"""
83
+ return len(self._app_cache)
84
+
85
+ def get_app(self, fn: Callable) -> PythonApp:
86
+ """Create a PythonApp for a function
87
+
88
+ Args:
89
+ fn: Function to be turned into a Parsl app
90
+ Returns:
91
+ PythonApp version of that function
92
+ """
93
+ if fn in self._app_cache:
94
+ return self._app_cache[fn]
95
+ app = PythonApp(fn, data_flow_kernel=self._dfk, executors=self.executors)
96
+ self._app_cache[fn] = app
97
+ return app
98
+
99
+ def submit(self, fn, *args, **kwargs):
100
+ """Submits a callable to be executed with the given arguments.
101
+
102
+ Schedules the callable to be executed as ``fn(*args, **kwargs)`` and returns
103
+ a Future instance representing the execution of the callable.
104
+
105
+ Returns:
106
+ A Future representing the given call.
107
+ """
108
+
109
+ if self._dfk is None:
110
+ raise RuntimeError('Executor has been shut down.')
111
+ app = self.get_app(fn)
112
+ return app(*args, **kwargs)
113
+
114
+ # TODO (wardlt): This override can go away when Parsl supports cancel
115
+ def map(self, fn: Callable, *iterables: Iterable, timeout: Optional[float] = None, chunksize: int = 1) -> Iterator:
116
+ """Returns an iterator equivalent to map(fn, iter).
117
+
118
+ Args:
119
+ fn: A callable that will take as many arguments as there are
120
+ passed iterables.
121
+ timeout: The maximum number of seconds to wait. If None, then there
122
+ is no limit on the wait time.
123
+ chunksize: If greater than one, the iterables will be chopped into
124
+ chunks of size chunksize and submitted to the process pool.
125
+ If set to one, the items in the list will be sent one at a time.
126
+
127
+ Returns:
128
+ An iterator equivalent to: map(func, ``*iterables``) but the calls may
129
+ be evaluated out-of-order.
130
+
131
+ Raises:
132
+ TimeoutError: If the entire result iterator could not be generated
133
+ before the given timeout.
134
+ Exception: If ``fn(*args)`` raises for any values.
135
+ """
136
+ # This is a version of the CPython 3.9 `.map` implementation modified to not use `cancel`
137
+ if timeout is not None:
138
+ end_time = timeout + time.monotonic()
139
+
140
+ # Submit the applications
141
+ app = self.get_app(fn)
142
+ fs = [app(*args) for args in zip(*iterables)]
143
+
144
+ # Yield the futures as completed
145
+ def result_iterator():
146
+ # reverse to keep finishing order
147
+ fs.reverse()
148
+ while fs:
149
+ # Careful not to keep a reference to the popped future
150
+ if timeout is None:
151
+ yield fs.pop().result()
152
+ else:
153
+ yield fs.pop().result(end_time - time.monotonic())
154
+
155
+ return result_iterator()
156
+
157
+ def shutdown(self, wait: bool = True, *, cancel_futures: bool = False) -> None:
158
+ if self._dfk is None:
159
+ return # Do nothing. Nothing is active
160
+ if cancel_futures:
161
+ warn(message="Canceling on-going tasks is not supported in Parsl")
162
+ if wait:
163
+ self._dfk.wait_for_current_tasks()
164
+ if self._config is not None: # The executors are being managed
165
+ self._dfk.cleanup() # Shutdown the DFK
166
+ self._dfk = None
@@ -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
@@ -4,7 +4,6 @@ import os
4
4
  from functools import partial
5
5
  from typing import Optional
6
6
 
7
- import globus_sdk
8
7
  import typeguard
9
8
 
10
9
  import parsl
@@ -79,6 +78,7 @@ class Globus:
79
78
 
80
79
  @classmethod
81
80
  def transfer_file(cls, src_ep, dst_ep, src_path, dst_path):
81
+ import globus_sdk
82
82
  tc = globus_sdk.TransferClient(authorizer=cls.authorizer)
83
83
  td = globus_sdk.TransferData(tc, src_ep, dst_ep)
84
84
  td.add_item(src_path, dst_path)
@@ -140,6 +140,7 @@ class Globus:
140
140
  def _do_native_app_authentication(cls, client_id, redirect_uri,
141
141
  requested_scopes=None):
142
142
 
143
+ import globus_sdk
143
144
  client = globus_sdk.NativeAppAuthClient(client_id=client_id)
144
145
  client.oauth2_start_flow(
145
146
  requested_scopes=requested_scopes,
@@ -154,6 +155,7 @@ class Globus:
154
155
 
155
156
  @classmethod
156
157
  def _get_native_app_authorizer(cls, client_id):
158
+ import globus_sdk
157
159
  tokens = None
158
160
  try:
159
161
  tokens = cls._load_tokens_from_file(cls.TOKEN_FILE)