parsl 2025.10.20__tar.gz → 2025.10.27__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 (468) hide show
  1. {parsl-2025.10.20/parsl.egg-info → parsl-2025.10.27}/PKG-INFO +3 -2
  2. parsl-2025.10.27/parsl/concurrent/__init__.py +166 -0
  3. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/data_provider/globus.py +3 -1
  4. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/dataflow/dflow.py +5 -5
  5. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/high_throughput/interchange.py +4 -7
  6. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/local_threads_globus.py +18 -14
  7. parsl-2025.10.27/parsl/tests/sites/test_concurrent.py +96 -0
  8. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_priority_queue.py +1 -1
  9. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_basic.py +0 -14
  10. parsl-2025.10.27/parsl/tests/test_python_apps/test_exception.py +19 -0
  11. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_staging/test_staging_globus.py +2 -2
  12. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/unit/test_globus_compute_executor.py +11 -2
  13. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/version.py +1 -1
  14. {parsl-2025.10.20 → parsl-2025.10.27/parsl.egg-info}/PKG-INFO +3 -2
  15. {parsl-2025.10.20 → parsl-2025.10.27}/parsl.egg-info/SOURCES.txt +1 -0
  16. {parsl-2025.10.20 → parsl-2025.10.27}/parsl.egg-info/requires.txt +4 -1
  17. {parsl-2025.10.20 → parsl-2025.10.27}/requirements.txt +0 -1
  18. {parsl-2025.10.20 → parsl-2025.10.27}/setup.py +1 -0
  19. parsl-2025.10.20/parsl/concurrent/__init__.py +0 -85
  20. parsl-2025.10.20/parsl/tests/sites/test_concurrent.py +0 -48
  21. {parsl-2025.10.20 → parsl-2025.10.27}/LICENSE +0 -0
  22. {parsl-2025.10.20 → parsl-2025.10.27}/MANIFEST.in +0 -0
  23. {parsl-2025.10.20 → parsl-2025.10.27}/README.rst +0 -0
  24. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/__init__.py +0 -0
  25. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/addresses.py +0 -0
  26. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/app/__init__.py +0 -0
  27. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/app/app.py +0 -0
  28. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/app/bash.py +0 -0
  29. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/app/errors.py +0 -0
  30. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/app/futures.py +0 -0
  31. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/app/python.py +0 -0
  32. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/benchmark/__init__.py +0 -0
  33. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/benchmark/perf.py +0 -0
  34. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/config.py +0 -0
  35. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/ASPIRE1.py +0 -0
  36. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/Azure.py +0 -0
  37. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/__init__.py +0 -0
  38. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/anvil.py +0 -0
  39. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/bridges.py +0 -0
  40. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/cc_in2p3.py +0 -0
  41. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/delta.py +0 -0
  42. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/ec2.py +0 -0
  43. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/expanse.py +0 -0
  44. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/frontera.py +0 -0
  45. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/gc_multisite.py +0 -0
  46. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/gc_tutorial.py +0 -0
  47. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/htex_local.py +0 -0
  48. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/illinoiscluster.py +0 -0
  49. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/improv.py +0 -0
  50. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/kubernetes.py +0 -0
  51. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/local_threads.py +0 -0
  52. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/midway.py +0 -0
  53. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/osg.py +0 -0
  54. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/polaris.py +0 -0
  55. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/stampede2.py +0 -0
  56. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/summit.py +0 -0
  57. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/toss3_llnl.py +0 -0
  58. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/vineex_local.py +0 -0
  59. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/configs/wqex_local.py +0 -0
  60. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/curvezmq.py +0 -0
  61. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/data_provider/__init__.py +0 -0
  62. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/data_provider/data_manager.py +0 -0
  63. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/data_provider/file_noop.py +0 -0
  64. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/data_provider/files.py +0 -0
  65. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/data_provider/ftp.py +0 -0
  66. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/data_provider/http.py +0 -0
  67. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/data_provider/rsync.py +0 -0
  68. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/data_provider/staging.py +0 -0
  69. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/data_provider/zip.py +0 -0
  70. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/dataflow/__init__.py +0 -0
  71. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/dataflow/dependency_resolvers.py +0 -0
  72. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/dataflow/errors.py +0 -0
  73. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/dataflow/futures.py +0 -0
  74. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/dataflow/memoization.py +0 -0
  75. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/dataflow/rundirs.py +0 -0
  76. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/dataflow/states.py +0 -0
  77. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/dataflow/taskrecord.py +0 -0
  78. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/errors.py +0 -0
  79. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/__init__.py +0 -0
  80. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/base.py +0 -0
  81. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/errors.py +0 -0
  82. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/execute_task.py +0 -0
  83. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/flux/__init__.py +0 -0
  84. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/flux/execute_parsl_task.py +0 -0
  85. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/flux/executor.py +0 -0
  86. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/flux/flux_instance_manager.py +0 -0
  87. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/globus_compute.py +0 -0
  88. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/high_throughput/__init__.py +0 -0
  89. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/high_throughput/errors.py +0 -0
  90. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/high_throughput/executor.py +0 -0
  91. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/high_throughput/manager_record.py +0 -0
  92. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/high_throughput/manager_selector.py +0 -0
  93. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/high_throughput/monitoring_info.py +0 -0
  94. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/high_throughput/mpi_executor.py +0 -0
  95. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/high_throughput/mpi_prefix_composer.py +0 -0
  96. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/high_throughput/mpi_resource_management.py +0 -0
  97. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/high_throughput/probe.py +0 -0
  98. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/high_throughput/process_worker_pool.py +0 -0
  99. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/high_throughput/zmq_pipes.py +0 -0
  100. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/radical/__init__.py +0 -0
  101. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/radical/executor.py +0 -0
  102. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/radical/rpex_resources.py +0 -0
  103. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/radical/rpex_worker.py +0 -0
  104. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/status_handling.py +0 -0
  105. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/taskvine/__init__.py +0 -0
  106. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/taskvine/errors.py +0 -0
  107. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/taskvine/exec_parsl_function.py +0 -0
  108. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/taskvine/executor.py +0 -0
  109. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/taskvine/factory.py +0 -0
  110. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/taskvine/factory_config.py +0 -0
  111. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/taskvine/manager.py +0 -0
  112. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/taskvine/manager_config.py +0 -0
  113. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/taskvine/utils.py +0 -0
  114. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/threads.py +0 -0
  115. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/workqueue/__init__.py +0 -0
  116. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/workqueue/errors.py +0 -0
  117. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/workqueue/exec_parsl_function.py +0 -0
  118. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/workqueue/executor.py +0 -0
  119. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/workqueue/parsl_coprocess.py +0 -0
  120. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
  121. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/jobs/__init__.py +0 -0
  122. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/jobs/error_handlers.py +0 -0
  123. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/jobs/errors.py +0 -0
  124. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/jobs/job_status_poller.py +0 -0
  125. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/jobs/states.py +0 -0
  126. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/jobs/strategy.py +0 -0
  127. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/launchers/__init__.py +0 -0
  128. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/launchers/base.py +0 -0
  129. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/launchers/errors.py +0 -0
  130. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/launchers/launchers.py +0 -0
  131. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/log_utils.py +0 -0
  132. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/__init__.py +0 -0
  133. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/db_manager.py +0 -0
  134. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/errors.py +0 -0
  135. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/message_type.py +0 -0
  136. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/monitoring.py +0 -0
  137. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/queries/__init__.py +0 -0
  138. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/queries/pandas.py +0 -0
  139. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/radios/__init__.py +0 -0
  140. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/radios/base.py +0 -0
  141. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/radios/filesystem.py +0 -0
  142. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/radios/filesystem_router.py +0 -0
  143. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/radios/htex.py +0 -0
  144. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/radios/multiprocessing.py +0 -0
  145. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/radios/udp.py +0 -0
  146. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/radios/udp_router.py +0 -0
  147. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/radios/zmq.py +0 -0
  148. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/radios/zmq_router.py +0 -0
  149. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/remote.py +0 -0
  150. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/types.py +0 -0
  151. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/__init__.py +0 -0
  152. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/app.py +0 -0
  153. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/models.py +0 -0
  154. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/plots/__init__.py +0 -0
  155. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
  156. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
  157. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/plots/default/workflow_plots.py +0 -0
  158. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +0 -0
  159. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
  160. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
  161. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/templates/app.html +0 -0
  162. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/templates/dag.html +0 -0
  163. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/templates/error.html +0 -0
  164. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/templates/layout.html +0 -0
  165. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
  166. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/templates/task.html +0 -0
  167. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/templates/workflow.html +0 -0
  168. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
  169. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/utils.py +0 -0
  170. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/version.py +0 -0
  171. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/monitoring/visualization/views.py +0 -0
  172. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/multiprocessing.py +0 -0
  173. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/process_loggers.py +0 -0
  174. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/__init__.py +0 -0
  175. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/aws/__init__.py +0 -0
  176. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/aws/aws.py +0 -0
  177. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/aws/template.py +0 -0
  178. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/azure/__init__.py +0 -0
  179. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/azure/azure.py +0 -0
  180. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/azure/template.py +0 -0
  181. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/base.py +0 -0
  182. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/cluster_provider.py +0 -0
  183. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/condor/__init__.py +0 -0
  184. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/condor/condor.py +0 -0
  185. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/condor/template.py +0 -0
  186. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/errors.py +0 -0
  187. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/googlecloud/__init__.py +0 -0
  188. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/googlecloud/googlecloud.py +0 -0
  189. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/grid_engine/__init__.py +0 -0
  190. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/grid_engine/grid_engine.py +0 -0
  191. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/grid_engine/template.py +0 -0
  192. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/kubernetes/__init__.py +0 -0
  193. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/kubernetes/kube.py +0 -0
  194. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/kubernetes/template.py +0 -0
  195. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/local/__init__.py +0 -0
  196. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/local/local.py +0 -0
  197. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/lsf/__init__.py +0 -0
  198. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/lsf/lsf.py +0 -0
  199. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/lsf/template.py +0 -0
  200. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/pbspro/__init__.py +0 -0
  201. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/pbspro/pbspro.py +0 -0
  202. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/pbspro/template.py +0 -0
  203. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/slurm/__init__.py +0 -0
  204. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/slurm/slurm.py +0 -0
  205. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/slurm/template.py +0 -0
  206. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/torque/__init__.py +0 -0
  207. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/torque/template.py +0 -0
  208. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/providers/torque/torque.py +0 -0
  209. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/py.typed +0 -0
  210. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/serialize/__init__.py +0 -0
  211. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/serialize/base.py +0 -0
  212. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/serialize/concretes.py +0 -0
  213. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/serialize/errors.py +0 -0
  214. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/serialize/facade.py +0 -0
  215. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/serialize/proxystore.py +0 -0
  216. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/__init__.py +0 -0
  217. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/callables_helper.py +0 -0
  218. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/__init__.py +0 -0
  219. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/azure_single_node.py +0 -0
  220. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/bluewaters.py +0 -0
  221. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/bridges.py +0 -0
  222. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/cc_in2p3.py +0 -0
  223. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/comet.py +0 -0
  224. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/ec2_single_node.py +0 -0
  225. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/ec2_spot.py +0 -0
  226. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/flux_local.py +0 -0
  227. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/frontera.py +0 -0
  228. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/globus_compute.py +0 -0
  229. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/htex_local.py +0 -0
  230. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/htex_local_alternate.py +0 -0
  231. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/htex_local_intask_staging.py +0 -0
  232. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/htex_local_rsync_staging.py +0 -0
  233. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/local_radical.py +0 -0
  234. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/local_radical_mpi.py +0 -0
  235. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/local_threads.py +0 -0
  236. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
  237. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
  238. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
  239. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
  240. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
  241. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/midway.py +0 -0
  242. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/nscc_singapore.py +0 -0
  243. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/osg_htex.py +0 -0
  244. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/petrelkube.py +0 -0
  245. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/slurm_local.py +0 -0
  246. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/summit.py +0 -0
  247. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/taskvine_ex.py +0 -0
  248. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/user_opts.py +0 -0
  249. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/configs/workqueue_ex.py +0 -0
  250. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/conftest.py +0 -0
  251. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/integration/__init__.py +0 -0
  252. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/integration/latency.py +0 -0
  253. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/integration/test_apps/__init__.py +0 -0
  254. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
  255. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/integration/test_stress/__init__.py +0 -0
  256. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
  257. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
  258. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/manual_tests/__init__.py +0 -0
  259. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/manual_tests/htex_local.py +0 -0
  260. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/manual_tests/test_basic.py +0 -0
  261. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/manual_tests/test_log_filter.py +0 -0
  262. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/manual_tests/test_memory_limits.py +0 -0
  263. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/manual_tests/test_regression_220.py +0 -0
  264. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/manual_tests/test_worker_count.py +0 -0
  265. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/site_tests/__init__.py +0 -0
  266. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/site_tests/site_config_selector.py +0 -0
  267. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/sites/__init__.py +0 -0
  268. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/sites/test_affinity.py +0 -0
  269. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/sites/test_dynamic_executor.py +0 -0
  270. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/sites/test_ec2.py +0 -0
  271. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/sites/test_launchers.py +0 -0
  272. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/sites/test_mpi/__init__.py +0 -0
  273. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/sites/test_worker_info.py +0 -0
  274. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_bash_apps/__init__.py +0 -0
  275. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
  276. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_bash_apps/test_basic.py +0 -0
  277. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
  278. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_bash_apps/test_inputs_default.py +0 -0
  279. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
  280. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -0
  281. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_bash_apps/test_memoize.py +0 -0
  282. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
  283. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
  284. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_bash_apps/test_multiline.py +0 -0
  285. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_bash_apps/test_pipeline.py +0 -0
  286. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_bash_apps/test_std_uri.py +0 -0
  287. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_bash_apps/test_stdout.py +0 -0
  288. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_callables.py +0 -0
  289. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_checkpointing/__init__.py +0 -0
  290. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_checkpointing/test_periodic.py +0 -0
  291. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +0 -0
  292. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
  293. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
  294. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_checkpointing/test_regression_233.py +0 -0
  295. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
  296. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_checkpointing/test_task_exit.py +0 -0
  297. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_curvezmq.py +0 -0
  298. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_docs/__init__.py +0 -0
  299. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_docs/test_from_slides.py +0 -0
  300. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_docs/test_kwargs.py +0 -0
  301. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
  302. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_docs/test_workflow1.py +0 -0
  303. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_docs/test_workflow4.py +0 -0
  304. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_error_handling/__init__.py +0 -0
  305. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_error_handling/test_fail.py +0 -0
  306. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_error_handling/test_python_walltime.py +0 -0
  307. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_error_handling/test_resource_spec.py +0 -0
  308. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_error_handling/test_retries.py +0 -0
  309. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
  310. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
  311. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
  312. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
  313. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_execute_task.py +0 -0
  314. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_flowcontrol/__init__.py +0 -0
  315. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_flux.py +0 -0
  316. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/__init__.py +0 -0
  317. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_basic.py +0 -0
  318. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_block_manager_selector_unit.py +0 -0
  319. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_command_client_timeout.py +0 -0
  320. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_command_concurrency_regression_1321.py +0 -0
  321. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_connected_blocks.py +0 -0
  322. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_cpu_affinity_explicit.py +0 -0
  323. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_disconnected_blocks.py +0 -0
  324. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_disconnected_blocks_failing_provider.py +0 -0
  325. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_drain.py +0 -0
  326. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_htex.py +0 -0
  327. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_interchange_exit_bad_registration.py +0 -0
  328. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_manager_failure.py +0 -0
  329. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_manager_selector_by_block.py +0 -0
  330. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_managers_command.py +0 -0
  331. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_missing_worker.py +0 -0
  332. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_multiple_disconnected_blocks.py +0 -0
  333. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_resource_spec_validation.py +0 -0
  334. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_worker_failure.py +0 -0
  335. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_htex/test_zmq_binding.py +0 -0
  336. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_monitoring/__init__.py +0 -0
  337. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_monitoring/test_app_names.py +0 -0
  338. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_monitoring/test_basic.py +0 -0
  339. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
  340. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_monitoring/test_exit_helper.py +0 -0
  341. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_monitoring/test_htex_fuzz_zmq.py +0 -0
  342. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +0 -0
  343. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_monitoring/test_incomplete_futures.py +0 -0
  344. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_monitoring/test_memoization_representation.py +0 -0
  345. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_monitoring/test_radio_filesystem.py +0 -0
  346. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_monitoring/test_radio_multiprocessing.py +0 -0
  347. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_monitoring/test_radio_udp.py +0 -0
  348. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_monitoring/test_radio_zmq.py +0 -0
  349. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_monitoring/test_stdouterr.py +0 -0
  350. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
  351. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_mpi_apps/__init__.py +0 -0
  352. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_mpi_apps/test_bad_mpi_config.py +0 -0
  353. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +0 -0
  354. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_mpi_apps/test_mpi_prefix.py +0 -0
  355. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_mpi_apps/test_mpi_scheduler.py +0 -0
  356. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_mpi_apps/test_mpiex.py +0 -0
  357. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_mpi_apps/test_resource_spec.py +0 -0
  358. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_providers/__init__.py +0 -0
  359. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_providers/test_kubernetes_provider.py +0 -0
  360. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_providers/test_local_provider.py +0 -0
  361. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_providers/test_pbspro_template.py +0 -0
  362. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_providers/test_slurm_instantiate.py +0 -0
  363. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_providers/test_slurm_template.py +0 -0
  364. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_providers/test_submiterror_deprecation.py +0 -0
  365. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/__init__.py +0 -0
  366. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
  367. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_context_manager.py +0 -0
  368. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_dep_standard_futures.py +0 -0
  369. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
  370. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_dependencies_deep.py +0 -0
  371. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_depfail_propagation.py +0 -0
  372. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_fail.py +0 -0
  373. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
  374. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
  375. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_futures.py +0 -0
  376. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_garbage_collect.py +0 -0
  377. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
  378. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_inputs_default.py +0 -0
  379. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_join.py +0 -0
  380. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_lifted.py +0 -0
  381. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_mapred.py +0 -0
  382. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
  383. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_memoize_2.py +0 -0
  384. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
  385. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +0 -0
  386. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_memoize_exception.py +0 -0
  387. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
  388. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
  389. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_outputs.py +0 -0
  390. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_overview.py +0 -0
  391. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_pipeline.py +0 -0
  392. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_pluggable_future_resolution.py +0 -0
  393. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_simple.py +0 -0
  394. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_timeout.py +0 -0
  395. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_python_apps/test_type5.py +0 -0
  396. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_radical/__init__.py +0 -0
  397. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_radical/test_mpi_funcs.py +0 -0
  398. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_regression/__init__.py +0 -0
  399. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_regression/test_1480.py +0 -0
  400. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +0 -0
  401. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_regression/test_1653.py +0 -0
  402. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_regression/test_221.py +0 -0
  403. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_regression/test_226.py +0 -0
  404. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_regression/test_2652.py +0 -0
  405. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_regression/test_3874.py +0 -0
  406. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_regression/test_69a.py +0 -0
  407. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_regression/test_97_parallelism_0.py +0 -0
  408. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_regression/test_98.py +0 -0
  409. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_scaling/__init__.py +0 -0
  410. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_scaling/test_block_error_handler.py +0 -0
  411. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_scaling/test_regression_1621.py +0 -0
  412. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_scaling/test_regression_3568_scaledown_vs_MISSING.py +0 -0
  413. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_scaling/test_regression_3696_oscillation.py +0 -0
  414. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_scaling/test_scale_down.py +0 -0
  415. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +0 -0
  416. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +0 -0
  417. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_scaling/test_shutdown_scalein.py +0 -0
  418. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_scaling/test_worker_interchange_bad_messages_3262.py +0 -0
  419. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_serialization/__init__.py +0 -0
  420. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_serialization/test_2555_caching_deserializer.py +0 -0
  421. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_serialization/test_3495_deserialize_managerlost.py +0 -0
  422. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_serialization/test_basic.py +0 -0
  423. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_serialization/test_htex_code_cache.py +0 -0
  424. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_serialization/test_proxystore_configured.py +0 -0
  425. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_serialization/test_proxystore_impl.py +0 -0
  426. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_shutdown/__init__.py +0 -0
  427. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_shutdown/test_kill_monitoring.py +0 -0
  428. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_staging/__init__.py +0 -0
  429. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_staging/staging_provider.py +0 -0
  430. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_staging/test_1316.py +0 -0
  431. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_staging/test_docs_1.py +0 -0
  432. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_staging/test_docs_2.py +0 -0
  433. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
  434. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_staging/test_file.py +0 -0
  435. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_staging/test_file_apps.py +0 -0
  436. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_staging/test_file_staging.py +0 -0
  437. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_staging/test_output_chain_filenames.py +0 -0
  438. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
  439. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
  440. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_staging/test_staging_https.py +0 -0
  441. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_staging/test_staging_stdout.py +0 -0
  442. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_staging/test_zip_in.py +0 -0
  443. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_staging/test_zip_out.py +0 -0
  444. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_staging/test_zip_to_zip.py +0 -0
  445. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_summary.py +0 -0
  446. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_thread_parallelism.py +0 -0
  447. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_threads/__init__.py +0 -0
  448. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_threads/test_configs.py +0 -0
  449. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
  450. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_utils/__init__.py +0 -0
  451. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_utils/test_execute_wait.py +0 -0
  452. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_utils/test_logutils.py +0 -0
  453. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_utils/test_representation_mixin.py +0 -0
  454. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/test_utils/test_sanitize_dns.py +0 -0
  455. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/unit/__init__.py +0 -0
  456. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/unit/test_address.py +0 -0
  457. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/unit/test_file.py +0 -0
  458. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/unit/test_usage_tracking.py +0 -0
  459. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/tests/utils.py +0 -0
  460. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/usage_tracking/__init__.py +0 -0
  461. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/usage_tracking/api.py +0 -0
  462. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/usage_tracking/levels.py +0 -0
  463. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/usage_tracking/usage.py +0 -0
  464. {parsl-2025.10.20 → parsl-2025.10.27}/parsl/utils.py +0 -0
  465. {parsl-2025.10.20 → parsl-2025.10.27}/parsl.egg-info/dependency_links.txt +0 -0
  466. {parsl-2025.10.20 → parsl-2025.10.27}/parsl.egg-info/entry_points.txt +0 -0
  467. {parsl-2025.10.20 → parsl-2025.10.27}/parsl.egg-info/top_level.txt +0 -0
  468. {parsl-2025.10.20 → parsl-2025.10.27}/setup.cfg +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: parsl
3
- Version: 2025.10.20
3
+ Version: 2025.10.27
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.10.20.tar.gz
6
+ Download-URL: https://github.com/Parsl/parsl/archive/2025.10.27.tar.gz
7
7
  Author: The Parsl Team
8
8
  Author-email: parsl@googlegroups.com
9
9
  License: Apache 2.0
@@ -28,6 +28,7 @@ Provides-Extra: flux
28
28
  Provides-Extra: proxystore
29
29
  Provides-Extra: radical-pilot
30
30
  Provides-Extra: globus_compute
31
+ Provides-Extra: globus_transfer
31
32
  Provides-Extra: all
32
33
  License-File: LICENSE
33
34
 
@@ -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
@@ -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)
@@ -190,7 +190,7 @@ class DataFlowKernel:
190
190
  self.tasks: Dict[int, TaskRecord] = {}
191
191
  self.submitter_lock = threading.Lock()
192
192
 
193
- self.dependency_launch_pool = cf.ThreadPoolExecutor(max_workers=1, thread_name_prefix="Dependency-Launch")
193
+ self._task_launch_pool = cf.ThreadPoolExecutor(max_workers=1, thread_name_prefix="Task-Launch")
194
194
 
195
195
  self.dependency_resolver = self.config.dependency_resolver if self.config.dependency_resolver is not None \
196
196
  else SHALLOW_DEPENDENCY_RESOLVER
@@ -608,7 +608,7 @@ class DataFlowKernel:
608
608
  launch_if_ready is thread safe, so may be called from any thread
609
609
  or callback.
610
610
  """
611
- self.dependency_launch_pool.submit(self._launch_if_ready_async, task_record)
611
+ self._task_launch_pool.submit(self._launch_if_ready_async, task_record)
612
612
 
613
613
  @wrap_with_logs
614
614
  def _launch_if_ready_async(self, task_record: TaskRecord) -> None:
@@ -1203,9 +1203,9 @@ class DataFlowKernel:
1203
1203
  self.monitoring.close()
1204
1204
  logger.info("Terminated monitoring")
1205
1205
 
1206
- logger.info("Terminating dependency launch pool")
1207
- self.dependency_launch_pool.shutdown()
1208
- logger.info("Terminated dependency launch pool")
1206
+ logger.info("Terminating task launch pool")
1207
+ self._task_launch_pool.shutdown()
1208
+ logger.info("Terminated task launch pool")
1209
1209
 
1210
1210
  logger.info("Unregistering atexit hook")
1211
1211
  atexit.unregister(self.atexit_cleanup)
@@ -138,9 +138,6 @@ class Interchange:
138
138
 
139
139
  self.pending_task_queue: SortedList[Any] = SortedList(key=lambda tup: (tup[0], tup[1]))
140
140
 
141
- # count of tasks that have been received from the submit side
142
- self.task_counter = 0
143
-
144
141
  # count of tasks that have been sent out to worker pools
145
142
  self.count = 0
146
143
 
@@ -332,15 +329,15 @@ class Interchange:
332
329
  msg = self.task_incoming.recv_pyobj()
333
330
 
334
331
  # Process priority, higher number = lower priority
332
+ task_id = msg['task_id']
335
333
  resource_spec = msg['context'].get('resource_spec', {})
336
334
  priority = resource_spec.get('priority', float('inf'))
337
- queue_entry = (-priority, -self.task_counter, msg)
335
+ queue_entry = (-priority, -task_id, msg)
338
336
 
339
- logger.debug("putting message onto pending_task_queue")
337
+ logger.debug("Putting task %s onto pending_task_queue", task_id)
340
338
 
341
339
  self.pending_task_queue.add(queue_entry)
342
- self.task_counter += 1
343
- logger.debug(f"Fetched {self.task_counter} tasks so far")
340
+ logger.debug("Put task %s onto pending_task_queue", task_id)
344
341
 
345
342
  def process_manager_socket_message(
346
343
  self,
@@ -1,6 +1,5 @@
1
1
  from parsl.config import Config
2
2
  from parsl.data_provider.data_manager import default_staging
3
- from parsl.data_provider.globus import GlobusStaging
4
3
  from parsl.executors.threads import ThreadPoolExecutor
5
4
 
6
5
  # If you are a developer running tests, make sure to update parsl/tests/configs/user_opts.py
@@ -10,19 +9,24 @@ from parsl.executors.threads import ThreadPoolExecutor
10
9
  # (i.e., user_opts['swan']['username'] -> 'your_username')
11
10
  from .user_opts import user_opts
12
11
 
13
- storage_access = default_staging + [GlobusStaging(
14
- endpoint_uuid=user_opts['globus']['endpoint'],
15
- endpoint_path=user_opts['globus']['path']
16
- )]
17
12
 
18
- config = Config(
19
- executors=[
20
- ThreadPoolExecutor(
21
- label='local_threads_globus',
22
- working_dir=user_opts['globus']['path'],
23
- storage_access=storage_access
24
- )
25
- ]
26
- )
13
+ def fresh_config():
14
+ from parsl.data_provider.globus import GlobusStaging
15
+
16
+ storage_access = default_staging + [GlobusStaging(
17
+ endpoint_uuid=user_opts['globus']['endpoint'],
18
+ endpoint_path=user_opts['globus']['path']
19
+ )]
20
+
21
+ return Config(
22
+ executors=[
23
+ ThreadPoolExecutor(
24
+ label='local_threads_globus',
25
+ working_dir=user_opts['globus']['path'],
26
+ storage_access=storage_access
27
+ )
28
+ ]
29
+ )
30
+
27
31
 
28
32
  remote_writeable = user_opts['globus']['remote_writeable']
@@ -0,0 +1,96 @@
1
+ """Tests of the interfaces to Python's concurrent library"""
2
+ from pytest import mark, raises, warns
3
+
4
+ from parsl import Config, HighThroughputExecutor, load, python_app
5
+ from parsl.concurrent import ParslPoolExecutor
6
+
7
+
8
+ def f(x):
9
+ return x + 1
10
+
11
+
12
+ def g(x):
13
+ return 2 * x
14
+
15
+
16
+ @python_app
17
+ def is_odd(x):
18
+ if x % 2 == 1:
19
+ return 1
20
+ else:
21
+ return 0
22
+
23
+
24
+ def make_config():
25
+ return Config(
26
+ executors=[
27
+ HighThroughputExecutor(
28
+ label='test_executor',
29
+ address="127.0.0.1",
30
+ max_workers_per_node=2,
31
+ heartbeat_period=2,
32
+ heartbeat_threshold=4,
33
+ encrypted=False,
34
+ )
35
+ ],
36
+ strategy='none',
37
+ )
38
+
39
+
40
+ @mark.local
41
+ def test_init_errors():
42
+ with load(make_config()) as dfk, raises(ValueError, match='Specify only one of config or dfk'):
43
+ ParslPoolExecutor(config=make_config(), dfk=dfk)
44
+
45
+ with raises(ValueError, match='Must specify one of config or dfk'):
46
+ ParslPoolExecutor()
47
+
48
+
49
+ @mark.local
50
+ def test_executor():
51
+ my_config = make_config()
52
+
53
+ with ParslPoolExecutor(my_config) as exc:
54
+ # Test a single submit
55
+ future = exc.submit(f, 1)
56
+ assert future.result() == 2
57
+
58
+ # Make sure the map works
59
+ results = list(exc.map(f, [1, 2, 3]))
60
+ assert results == [2, 3, 4]
61
+
62
+ # Make sure map works with a timeout
63
+ results = list(exc.map(f, [1, 2, 3], timeout=5))
64
+ assert results == [2, 3, 4]
65
+
66
+ # Make sure only one function was registered
67
+ assert exc.app_count == 1
68
+
69
+ with raises(RuntimeError, match='shut down'):
70
+ exc.submit(f, 1)
71
+
72
+ with warns(UserWarning):
73
+ ParslPoolExecutor(make_config()).shutdown(False, cancel_futures=True)
74
+
75
+
76
+ @mark.local
77
+ def test_with_dfk():
78
+ config = make_config()
79
+
80
+ with load(config) as dfk, ParslPoolExecutor(dfk=dfk, executors=['test_executor']) as exc:
81
+ future = exc.submit(f, 1)
82
+ assert future.result() == 2
83
+ assert exc.get_app(f).executors == ['test_executor']
84
+
85
+
86
+ @mark.local
87
+ def test_chaining():
88
+ """Make sure the executor functions can be chained together"""
89
+ config = make_config()
90
+
91
+ with ParslPoolExecutor(config) as exc:
92
+ future_odd = exc.submit(f, 10)
93
+ assert is_odd(future_odd).result()
94
+
95
+ future_even = exc.submit(g, future_odd)
96
+ assert not is_odd(future_even).result()
@@ -61,7 +61,7 @@ def test_priority_queue(try_assert):
61
61
  with open(htex.worker_logdir + "/interchange.log", "r") as f:
62
62
  lines = f.readlines()
63
63
  for line in lines:
64
- if f"Fetched {n} tasks so far" in line:
64
+ if f"Put task {n} onto pending_task_queue" in line:
65
65
  return True
66
66
  return False
67
67
 
@@ -14,12 +14,6 @@ def import_square(x):
14
14
  return math.pow(x, 2)
15
15
 
16
16
 
17
- @python_app
18
- def custom_exception():
19
- from globus_sdk import GlobusError
20
- raise GlobusError('foobar')
21
-
22
-
23
17
  def test_simple(n=2):
24
18
  x = double(n)
25
19
  assert x.result() == n * 2
@@ -38,11 +32,3 @@ def test_parallel_for(n):
38
32
 
39
33
  for i in d:
40
34
  assert d[i].result() == 2 * i
41
-
42
-
43
- def test_custom_exception():
44
- from globus_sdk import GlobusError
45
-
46
- x = custom_exception()
47
- with pytest.raises(GlobusError):
48
- x.result()
@@ -0,0 +1,19 @@
1
+ import pytest
2
+
3
+ from parsl.app.app import python_app
4
+
5
+
6
+ class CustomException(Exception):
7
+ pass
8
+
9
+
10
+ @python_app
11
+ def custom_exception():
12
+ from parsl.tests.test_python_apps.test_exception import CustomException
13
+ raise CustomException('foobar')
14
+
15
+
16
+ def test_custom_exception():
17
+ x = custom_exception()
18
+ with pytest.raises(CustomException):
19
+ x.result()
@@ -3,9 +3,9 @@ import pytest
3
3
  import parsl
4
4
  from parsl.app.app import python_app
5
5
  from parsl.data_provider.files import File
6
- from parsl.tests.configs.local_threads_globus import config, remote_writeable
6
+ from parsl.tests.configs.local_threads_globus import fresh_config, remote_writeable
7
7
 
8
- local_config = config
8
+ local_config = fresh_config
9
9
 
10
10
 
11
11
  @python_app
@@ -2,18 +2,21 @@ import random
2
2
  from unittest import mock
3
3
 
4
4
  import pytest
5
- from globus_compute_sdk import Executor
6
5
 
7
6
  from parsl.executors import GlobusComputeExecutor
8
7
 
9
8
 
10
9
  @pytest.fixture
11
10
  def mock_ex():
12
- # Not Parsl's job to test GC's Executor
11
+ # Not Parsl's job to test GC's Executor, although it
12
+ # still needs to be importable for these test cases.
13
+ from globus_compute_sdk import Executor
14
+
13
15
  yield mock.Mock(spec=Executor)
14
16
 
15
17
 
16
18
  @pytest.mark.local
19
+ @pytest.mark.globus_compute
17
20
  def test_gc_executor_mock_spec(mock_ex):
18
21
  # a test of tests -- make sure we're using spec= in the mock
19
22
  with pytest.raises(AttributeError):
@@ -21,12 +24,14 @@ def test_gc_executor_mock_spec(mock_ex):
21
24
 
22
25
 
23
26
  @pytest.mark.local
27
+ @pytest.mark.globus_compute
24
28
  def test_gc_executor_label_default(mock_ex):
25
29
  gce = GlobusComputeExecutor(mock_ex)
26
30
  assert gce.label == type(gce).__name__, "Expect reasonable default label"
27
31
 
28
32
 
29
33
  @pytest.mark.local
34
+ @pytest.mark.globus_compute
30
35
  def test_gc_executor_label(mock_ex, randomstring):
31
36
  exp_label = randomstring()
32
37
  gce = GlobusComputeExecutor(mock_ex, label=exp_label)
@@ -34,6 +39,7 @@ def test_gc_executor_label(mock_ex, randomstring):
34
39
 
35
40
 
36
41
  @pytest.mark.local
42
+ @pytest.mark.globus_compute
37
43
  def test_gc_executor_resets_spec_after_submit(mock_ex, randomstring):
38
44
  submit_res = {randomstring(): "some submit res"}
39
45
  res = {"some": randomstring(), "spec": randomstring()}
@@ -57,6 +63,7 @@ def test_gc_executor_resets_spec_after_submit(mock_ex, randomstring):
57
63
 
58
64
 
59
65
  @pytest.mark.local
66
+ @pytest.mark.globus_compute
60
67
  def test_gc_executor_resets_uep_after_submit(mock_ex, randomstring):
61
68
  uep_conf = randomstring()
62
69
  res = {"some": randomstring()}
@@ -79,6 +86,7 @@ def test_gc_executor_resets_uep_after_submit(mock_ex, randomstring):
79
86
 
80
87
 
81
88
  @pytest.mark.local
89
+ @pytest.mark.globus_compute
82
90
  def test_gc_executor_happy_path(mock_ex, randomstring):
83
91
  mock_fn = mock.Mock()
84
92
  args = tuple(randomstring() for _ in range(random.randint(0, 3)))
@@ -95,6 +103,7 @@ def test_gc_executor_happy_path(mock_ex, randomstring):
95
103
 
96
104
 
97
105
  @pytest.mark.local
106
+ @pytest.mark.globus_compute
98
107
  def test_gc_executor_shuts_down_asynchronously(mock_ex):
99
108
  gce = GlobusComputeExecutor(mock_ex)
100
109
  gce.shutdown()
@@ -3,4 +3,4 @@
3
3
  Year.Month.Day[alpha/beta/..]
4
4
  Alphas will be numbered like this -> 2024.12.10a0
5
5
  """
6
- VERSION = '2025.10.20'
6
+ VERSION = '2025.10.27'
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: parsl
3
- Version: 2025.10.20
3
+ Version: 2025.10.27
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.10.20.tar.gz
6
+ Download-URL: https://github.com/Parsl/parsl/archive/2025.10.27.tar.gz
7
7
  Author: The Parsl Team
8
8
  Author-email: parsl@googlegroups.com
9
9
  License: Apache 2.0
@@ -28,6 +28,7 @@ Provides-Extra: flux
28
28
  Provides-Extra: proxystore
29
29
  Provides-Extra: radical-pilot
30
30
  Provides-Extra: globus_compute
31
+ Provides-Extra: globus_transfer
31
32
  Provides-Extra: all
32
33
  License-File: LICENSE
33
34
 
@@ -370,6 +370,7 @@ parsl/tests/test_python_apps/test_dep_standard_futures.py
370
370
  parsl/tests/test_python_apps/test_dependencies.py
371
371
  parsl/tests/test_python_apps/test_dependencies_deep.py
372
372
  parsl/tests/test_python_apps/test_depfail_propagation.py
373
+ parsl/tests/test_python_apps/test_exception.py
373
374
  parsl/tests/test_python_apps/test_fail.py
374
375
  parsl/tests/test_python_apps/test_fibonacci_iterative.py
375
376
  parsl/tests/test_python_apps/test_fibonacci_recursive.py
@@ -1,7 +1,6 @@
1
1
  pyzmq>=17.1.2
2
2
  typeguard!=3.*,<5,>=2.10
3
3
  typing-extensions<5,>=4.6
4
- globus-sdk
5
4
  dill
6
5
  tblib
7
6
  requests
@@ -38,6 +37,7 @@ proxystore
38
37
  radical.pilot==1.90
39
38
  radical.utils==1.90
40
39
  globus_compute_sdk>=2.34.0
40
+ globus-sdk
41
41
 
42
42
  [aws]
43
43
  boto3
@@ -60,6 +60,9 @@ jsonschema
60
60
  [globus_compute]
61
61
  globus_compute_sdk>=2.34.0
62
62
 
63
+ [globus_transfer]
64
+ globus-sdk
65
+
63
66
  [google_cloud]
64
67
  google-auth
65
68
  google-api-python-client
@@ -8,7 +8,6 @@ typeguard>=2.10,!=3.*,<5
8
8
 
9
9
 
10
10
  typing-extensions>=4.6,<5
11
- globus-sdk
12
11
  dill
13
12
  tblib
14
13
  requests
@@ -46,6 +46,7 @@ extras_require = {
46
46
  'proxystore': ['proxystore'],
47
47
  'radical-pilot': ['radical.pilot==1.90', 'radical.utils==1.90'],
48
48
  'globus_compute': ['globus_compute_sdk>=2.34.0'],
49
+ 'globus_transfer': ['globus-sdk'],
49
50
  # Disabling psi-j since github direct links are not allowed by pypi
50
51
  # 'psij': ['psi-j-parsl@git+https://github.com/ExaWorks/psi-j-parsl']
51
52
  }