parsl 2023.10.16__tar.gz → 2023.11.13__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 (419) hide show
  1. {parsl-2023.10.16/parsl.egg-info → parsl-2023.11.13}/PKG-INFO +3 -2
  2. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/app/app.py +29 -21
  3. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/channels/base.py +12 -24
  4. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/config.py +19 -12
  5. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/ad_hoc.py +2 -2
  6. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/dataflow/dflow.py +56 -49
  7. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/dataflow/futures.py +39 -9
  8. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/dataflow/taskrecord.py +7 -0
  9. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/base.py +1 -1
  10. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/high_throughput/executor.py +2 -2
  11. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/high_throughput/interchange.py +59 -53
  12. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/high_throughput/process_worker_pool.py +2 -2
  13. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/high_throughput/zmq_pipes.py +1 -1
  14. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/status_handling.py +1 -1
  15. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/taskvine/exec_parsl_function.py +3 -4
  16. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/taskvine/executor.py +18 -4
  17. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/taskvine/factory.py +1 -1
  18. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/taskvine/manager.py +12 -16
  19. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/taskvine/utils.py +5 -5
  20. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/threads.py +1 -2
  21. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/workqueue/errors.py +4 -2
  22. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/workqueue/exec_parsl_function.py +2 -1
  23. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/workqueue/executor.py +38 -22
  24. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/workqueue/parsl_coprocess.py +0 -1
  25. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/monitoring.py +6 -6
  26. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/remote.py +1 -1
  27. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/plots/default/workflow_plots.py +4 -4
  28. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +2 -2
  29. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/slurm/slurm.py +1 -1
  30. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/ad_hoc_cluster_htex.py +3 -3
  31. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/htex_ad_hoc_cluster.py +1 -1
  32. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/local_threads_monitoring.py +1 -1
  33. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/conftest.py +6 -2
  34. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/scaling_tests/vineex_condor.py +1 -1
  35. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/scaling_tests/vineex_local.py +1 -1
  36. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/scaling_tests/wqex_condor.py +1 -1
  37. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/scaling_tests/wqex_local.py +1 -1
  38. parsl-2023.11.13/parsl/tests/test_docs/test_kwargs.py +37 -0
  39. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_error_handling/test_python_walltime.py +2 -2
  40. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_monitoring/test_memoization_representation.py +5 -5
  41. parsl-2023.11.13/parsl/tests/test_python_apps/test_lifted.py +138 -0
  42. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/utils.py +4 -4
  43. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/version.py +1 -1
  44. {parsl-2023.10.16 → parsl-2023.11.13/parsl.egg-info}/PKG-INFO +3 -2
  45. {parsl-2023.10.16 → parsl-2023.11.13}/parsl.egg-info/SOURCES.txt +2 -0
  46. {parsl-2023.10.16 → parsl-2023.11.13}/parsl.egg-info/requires.txt +8 -6
  47. {parsl-2023.10.16 → parsl-2023.11.13}/setup.py +3 -1
  48. {parsl-2023.10.16 → parsl-2023.11.13}/LICENSE +0 -0
  49. {parsl-2023.10.16 → parsl-2023.11.13}/MANIFEST.in +0 -0
  50. {parsl-2023.10.16 → parsl-2023.11.13}/README.rst +0 -0
  51. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/__init__.py +0 -0
  52. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/addresses.py +0 -0
  53. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/app/__init__.py +0 -0
  54. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/app/bash.py +0 -0
  55. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/app/errors.py +0 -0
  56. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/app/futures.py +0 -0
  57. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/app/python.py +0 -0
  58. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/benchmark/__init__.py +0 -0
  59. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/benchmark/perf.py +0 -0
  60. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/channels/__init__.py +0 -0
  61. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/channels/errors.py +0 -0
  62. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/channels/local/__init__.py +0 -0
  63. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/channels/local/local.py +0 -0
  64. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/channels/oauth_ssh/__init__.py +0 -0
  65. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/channels/oauth_ssh/oauth_ssh.py +0 -0
  66. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/channels/ssh/__init__.py +0 -0
  67. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/channels/ssh/ssh.py +0 -0
  68. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/channels/ssh_il/__init__.py +0 -0
  69. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/channels/ssh_il/ssh_il.py +0 -0
  70. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/concurrent/__init__.py +0 -0
  71. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/ASPIRE1.py +0 -0
  72. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/Azure.py +0 -0
  73. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/__init__.py +0 -0
  74. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/bluewaters.py +0 -0
  75. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/bridges.py +0 -0
  76. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/cc_in2p3.py +0 -0
  77. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/comet.py +0 -0
  78. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/cooley.py +0 -0
  79. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/ec2.py +0 -0
  80. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/frontera.py +0 -0
  81. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/htex_local.py +0 -0
  82. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/illinoiscluster.py +0 -0
  83. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/kubernetes.py +0 -0
  84. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/local_threads.py +0 -0
  85. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/midway.py +0 -0
  86. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/osg.py +0 -0
  87. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/polaris.py +0 -0
  88. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/stampede2.py +0 -0
  89. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/summit.py +0 -0
  90. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/theta.py +0 -0
  91. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/toss3_llnl.py +0 -0
  92. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/vineex_local.py +0 -0
  93. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/configs/wqex_local.py +0 -0
  94. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/data_provider/__init__.py +0 -0
  95. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/data_provider/data_manager.py +0 -0
  96. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/data_provider/file_noop.py +0 -0
  97. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/data_provider/files.py +0 -0
  98. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/data_provider/ftp.py +0 -0
  99. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/data_provider/globus.py +0 -0
  100. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/data_provider/http.py +0 -0
  101. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/data_provider/rsync.py +0 -0
  102. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/data_provider/staging.py +0 -0
  103. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/dataflow/__init__.py +0 -0
  104. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/dataflow/errors.py +0 -0
  105. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/dataflow/memoization.py +0 -0
  106. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/dataflow/rundirs.py +0 -0
  107. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/dataflow/states.py +0 -0
  108. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/errors.py +0 -0
  109. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/__init__.py +0 -0
  110. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/errors.py +0 -0
  111. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/flux/__init__.py +0 -0
  112. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/flux/execute_parsl_task.py +0 -0
  113. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/flux/executor.py +0 -0
  114. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/flux/flux_instance_manager.py +0 -0
  115. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/high_throughput/__init__.py +0 -0
  116. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/high_throughput/errors.py +0 -0
  117. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/high_throughput/manager_record.py +0 -0
  118. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/high_throughput/monitoring_info.py +0 -0
  119. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/high_throughput/probe.py +0 -0
  120. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/taskvine/__init__.py +0 -0
  121. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/taskvine/errors.py +0 -0
  122. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/taskvine/factory_config.py +0 -0
  123. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/taskvine/manager_config.py +0 -0
  124. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/workqueue/__init__.py +0 -0
  125. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/executors/workqueue/parsl_coprocess_stub.py +0 -0
  126. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/jobs/__init__.py +0 -0
  127. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/jobs/error_handlers.py +0 -0
  128. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/jobs/errors.py +0 -0
  129. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/jobs/job_status_poller.py +0 -0
  130. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/jobs/states.py +0 -0
  131. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/jobs/strategy.py +0 -0
  132. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/launchers/__init__.py +0 -0
  133. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/launchers/base.py +0 -0
  134. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/launchers/errors.py +0 -0
  135. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/launchers/launchers.py +0 -0
  136. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/log_utils.py +0 -0
  137. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/__init__.py +0 -0
  138. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/db_manager.py +0 -0
  139. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/message_type.py +0 -0
  140. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/queries/__init__.py +0 -0
  141. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/queries/pandas.py +0 -0
  142. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/radios.py +0 -0
  143. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/types.py +0 -0
  144. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/__init__.py +0 -0
  145. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/app.py +0 -0
  146. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/models.py +0 -0
  147. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/plots/__init__.py +0 -0
  148. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/plots/default/__init__.py +0 -0
  149. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/plots/default/task_plots.py +0 -0
  150. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/static/parsl-logo-white.png +0 -0
  151. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/static/parsl-monitor.css +0 -0
  152. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/templates/app.html +0 -0
  153. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/templates/dag.html +0 -0
  154. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/templates/error.html +0 -0
  155. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/templates/layout.html +0 -0
  156. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/templates/resource_usage.html +0 -0
  157. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/templates/task.html +0 -0
  158. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/templates/workflow.html +0 -0
  159. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/templates/workflows_summary.html +0 -0
  160. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/utils.py +0 -0
  161. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/version.py +0 -0
  162. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/monitoring/visualization/views.py +0 -0
  163. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/multiprocessing.py +0 -0
  164. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/process_loggers.py +0 -0
  165. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/__init__.py +0 -0
  166. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/ad_hoc/__init__.py +0 -0
  167. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/ad_hoc/ad_hoc.py +0 -0
  168. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/aws/__init__.py +0 -0
  169. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/aws/aws.py +0 -0
  170. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/aws/template.py +0 -0
  171. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/azure/__init__.py +0 -0
  172. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/azure/azure.py +0 -0
  173. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/azure/template.py +0 -0
  174. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/base.py +0 -0
  175. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/cluster_provider.py +0 -0
  176. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/cobalt/__init__.py +0 -0
  177. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/cobalt/cobalt.py +0 -0
  178. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/cobalt/template.py +0 -0
  179. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/condor/__init__.py +0 -0
  180. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/condor/condor.py +0 -0
  181. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/condor/template.py +0 -0
  182. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/errors.py +0 -0
  183. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/googlecloud/__init__.py +0 -0
  184. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/googlecloud/googlecloud.py +0 -0
  185. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/grid_engine/__init__.py +0 -0
  186. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/grid_engine/grid_engine.py +0 -0
  187. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/grid_engine/template.py +0 -0
  188. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/kubernetes/__init__.py +0 -0
  189. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/kubernetes/kube.py +0 -0
  190. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/kubernetes/template.py +0 -0
  191. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/local/__init__.py +0 -0
  192. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/local/local.py +0 -0
  193. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/lsf/__init__.py +0 -0
  194. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/lsf/lsf.py +0 -0
  195. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/lsf/template.py +0 -0
  196. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/pbspro/__init__.py +0 -0
  197. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/pbspro/pbspro.py +0 -0
  198. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/pbspro/template.py +0 -0
  199. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/slurm/__init__.py +0 -0
  200. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/slurm/template.py +0 -0
  201. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/torque/__init__.py +0 -0
  202. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/torque/template.py +0 -0
  203. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/providers/torque/torque.py +0 -0
  204. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/py.typed +0 -0
  205. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/serialize/__init__.py +0 -0
  206. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/serialize/base.py +0 -0
  207. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/serialize/concretes.py +0 -0
  208. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/serialize/errors.py +0 -0
  209. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/serialize/facade.py +0 -0
  210. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/serialize/proxystore.py +0 -0
  211. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/__init__.py +0 -0
  212. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/callables_helper.py +0 -0
  213. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/__init__.py +0 -0
  214. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/azure_single_node.py +0 -0
  215. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/bluewaters.py +0 -0
  216. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/bridges.py +0 -0
  217. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/cc_in2p3.py +0 -0
  218. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/comet.py +0 -0
  219. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/cooley_htex.py +0 -0
  220. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/ec2_single_node.py +0 -0
  221. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/ec2_spot.py +0 -0
  222. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/frontera.py +0 -0
  223. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/htex_local.py +0 -0
  224. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/htex_local_alternate.py +0 -0
  225. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/htex_local_intask_staging.py +0 -0
  226. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/htex_local_rsync_staging.py +0 -0
  227. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/local_adhoc.py +0 -0
  228. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/local_threads.py +0 -0
  229. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/local_threads_checkpoint.py +0 -0
  230. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/local_threads_checkpoint_dfk_exit.py +0 -0
  231. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/local_threads_checkpoint_periodic.py +0 -0
  232. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/local_threads_checkpoint_task_exit.py +0 -0
  233. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/local_threads_ftp_in_task.py +0 -0
  234. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/local_threads_globus.py +0 -0
  235. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/local_threads_http_in_task.py +0 -0
  236. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/local_threads_no_cache.py +0 -0
  237. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/midway.py +0 -0
  238. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/nscc_singapore.py +0 -0
  239. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/osg_htex.py +0 -0
  240. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/petrelkube.py +0 -0
  241. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/summit.py +0 -0
  242. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/swan_htex.py +0 -0
  243. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/taskvine_ex.py +0 -0
  244. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/theta.py +0 -0
  245. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/user_opts.py +0 -0
  246. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/configs/workqueue_ex.py +0 -0
  247. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/integration/__init__.py +0 -0
  248. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/integration/latency.py +0 -0
  249. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/integration/test_apps/__init__.py +0 -0
  250. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/integration/test_channels/__init__.py +0 -0
  251. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/integration/test_channels/test_channels.py +0 -0
  252. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/integration/test_channels/test_local_channel.py +0 -0
  253. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/integration/test_channels/test_scp_1.py +0 -0
  254. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/integration/test_channels/test_ssh_1.py +0 -0
  255. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/integration/test_channels/test_ssh_errors.py +0 -0
  256. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/integration/test_channels/test_ssh_file_transport.py +0 -0
  257. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/integration/test_channels/test_ssh_interactive.py +0 -0
  258. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/integration/test_parsl_load_default_config.py +0 -0
  259. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/integration/test_stress/__init__.py +0 -0
  260. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/integration/test_stress/test_python_simple.py +0 -0
  261. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/integration/test_stress/test_python_threads.py +0 -0
  262. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/manual_tests/__init__.py +0 -0
  263. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/manual_tests/htex_local.py +0 -0
  264. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/manual_tests/test_ad_hoc_htex.py +0 -0
  265. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/manual_tests/test_basic.py +0 -0
  266. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/manual_tests/test_fan_in_out_htex_remote.py +0 -0
  267. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/manual_tests/test_log_filter.py +0 -0
  268. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/manual_tests/test_memory_limits.py +0 -0
  269. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/manual_tests/test_oauth_ssh.py +0 -0
  270. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/manual_tests/test_regression_220.py +0 -0
  271. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/manual_tests/test_udp_simple.py +0 -0
  272. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/manual_tests/test_worker_count.py +0 -0
  273. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/scaling_tests/__init__.py +0 -0
  274. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/scaling_tests/htex_local.py +0 -0
  275. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/scaling_tests/local_threads.py +0 -0
  276. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/scaling_tests/test_scale.py +0 -0
  277. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/site_tests/__init__.py +0 -0
  278. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/site_tests/site_config_selector.py +0 -0
  279. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/site_tests/test_provider.py +0 -0
  280. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/site_tests/test_site.py +0 -0
  281. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/sites/__init__.py +0 -0
  282. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/sites/test_affinity.py +0 -0
  283. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/sites/test_concurrent.py +0 -0
  284. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/sites/test_dynamic_executor.py +0 -0
  285. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/sites/test_ec2.py +0 -0
  286. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/sites/test_launchers.py +0 -0
  287. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/sites/test_local_adhoc.py +0 -0
  288. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/sites/test_mpi/__init__.py +0 -0
  289. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/sites/test_start_method.py +0 -0
  290. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/sites/test_worker_info.py +0 -0
  291. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_aalst_patterns.py +0 -0
  292. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_bash_apps/__init__.py +0 -0
  293. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_bash_apps/test_apptimeout.py +0 -0
  294. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_bash_apps/test_basic.py +0 -0
  295. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_bash_apps/test_error_codes.py +0 -0
  296. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_bash_apps/test_keyword_overlaps.py +0 -0
  297. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_bash_apps/test_kwarg_storage.py +0 -0
  298. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_bash_apps/test_memoize.py +0 -0
  299. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_bash_apps/test_memoize_ignore_args.py +0 -0
  300. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +0 -0
  301. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_bash_apps/test_multiline.py +0 -0
  302. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_bash_apps/test_pipeline.py +0 -0
  303. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_bash_apps/test_stdout.py +0 -0
  304. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_callables.py +0 -0
  305. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_channels/__init__.py +0 -0
  306. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_channels/test_large_output.py +0 -0
  307. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_checkpointing/__init__.py +0 -0
  308. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_checkpointing/test_periodic.py +0 -0
  309. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_checkpointing/test_python_checkpoint_1.py +0 -0
  310. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_checkpointing/test_python_checkpoint_2.py +0 -0
  311. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_checkpointing/test_python_checkpoint_3.py +0 -0
  312. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_checkpointing/test_regression_232.py +0 -0
  313. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_checkpointing/test_regression_233.py +0 -0
  314. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_checkpointing/test_regression_239.py +0 -0
  315. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_checkpointing/test_task_exit.py +0 -0
  316. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_data/__init__.py +0 -0
  317. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_data/test_file.py +0 -0
  318. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_data/test_file_apps.py +0 -0
  319. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_data/test_file_staging.py +0 -0
  320. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_data/test_output_chain_filenames.py +0 -0
  321. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_docs/__init__.py +0 -0
  322. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_docs/test_from_slides.py +0 -0
  323. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_docs/test_tutorial_1.py +0 -0
  324. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_docs/test_workflow1.py +0 -0
  325. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_docs/test_workflow2.py +0 -0
  326. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_docs/test_workflow4.py +0 -0
  327. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_error_handling/__init__.py +0 -0
  328. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_error_handling/test_fail.py +0 -0
  329. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_error_handling/test_htex_basic.py +0 -0
  330. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_error_handling/test_htex_missing_worker.py +0 -0
  331. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_error_handling/test_htex_worker_failure.py +0 -0
  332. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_error_handling/test_rand_fail.py +0 -0
  333. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_error_handling/test_resource_spec.py +0 -0
  334. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_error_handling/test_retries.py +0 -0
  335. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_error_handling/test_retry_handler.py +0 -0
  336. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_error_handling/test_retry_handler_failure.py +0 -0
  337. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_error_handling/test_serialization_fail.py +0 -0
  338. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_error_handling/test_wrap_with_logs.py +0 -0
  339. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_flowcontrol/__init__.py +0 -0
  340. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_flux.py +0 -0
  341. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_htex/__init__.py +0 -0
  342. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_htex/test_htex_zmq_binding.py +0 -0
  343. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_monitoring/__init__.py +0 -0
  344. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_monitoring/test_basic.py +0 -0
  345. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_monitoring/test_db_locks.py +0 -0
  346. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_monitoring/test_fuzz_zmq.py +0 -0
  347. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_monitoring/test_viz_colouring.py +0 -0
  348. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_providers/__init__.py +0 -0
  349. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_providers/test_local_provider.py +0 -0
  350. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/__init__.py +0 -0
  351. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_arg_input_types.py +0 -0
  352. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_basic.py +0 -0
  353. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_dep_standard_futures.py +0 -0
  354. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_dependencies.py +0 -0
  355. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_depfail_propagation.py +0 -0
  356. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_fail.py +0 -0
  357. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_fibonacci_iterative.py +0 -0
  358. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_fibonacci_recursive.py +0 -0
  359. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_futures.py +0 -0
  360. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_garbage_collect.py +0 -0
  361. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_import_fail.py +0 -0
  362. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_join.py +0 -0
  363. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_mapred.py +0 -0
  364. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_memoize_1.py +0 -0
  365. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_memoize_2.py +0 -0
  366. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_memoize_4.py +0 -0
  367. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +0 -0
  368. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_memoize_ignore_args.py +0 -0
  369. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_memoize_joinapp.py +0 -0
  370. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_outputs.py +0 -0
  371. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_overview.py +0 -0
  372. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_pipeline.py +0 -0
  373. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_simple.py +0 -0
  374. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_timeout.py +0 -0
  375. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_python_apps/test_type5.py +0 -0
  376. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_regression/__init__.py +0 -0
  377. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_regression/test_1480.py +0 -0
  378. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_regression/test_1606_wait_for_current_tasks.py +0 -0
  379. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_regression/test_1653.py +0 -0
  380. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_regression/test_221.py +0 -0
  381. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_regression/test_226.py +0 -0
  382. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_regression/test_2652.py +0 -0
  383. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_regression/test_69a.py +0 -0
  384. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_regression/test_854.py +0 -0
  385. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_regression/test_97_parallelism_0.py +0 -0
  386. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_regression/test_98.py +0 -0
  387. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_scaling/__init__.py +0 -0
  388. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_scaling/test_block_error_handler.py +0 -0
  389. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_scaling/test_regression_1621.py +0 -0
  390. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_scaling/test_scale_down.py +0 -0
  391. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_serialization/__init__.py +0 -0
  392. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_serialization/test_2555_caching_deserializer.py +0 -0
  393. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_serialization/test_basic.py +0 -0
  394. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_serialization/test_proxystore_configured.py +0 -0
  395. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_serialization/test_proxystore_impl.py +0 -0
  396. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_staging/__init__.py +0 -0
  397. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_staging/staging_provider.py +0 -0
  398. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_staging/test_1316.py +0 -0
  399. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_staging/test_docs_1.py +0 -0
  400. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_staging/test_docs_2.py +0 -0
  401. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_staging/test_elaborate_noop_file.py +0 -0
  402. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_staging/test_staging_ftp.py +0 -0
  403. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_staging/test_staging_ftp_in_task.py +0 -0
  404. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_staging/test_staging_globus.py +0 -0
  405. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_staging/test_staging_https.py +0 -0
  406. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_staging/test_staging_https_in_task.py +0 -0
  407. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_summary.py +0 -0
  408. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_thread_parallelism.py +0 -0
  409. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_threads/__init__.py +0 -0
  410. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_threads/test_configs.py +0 -0
  411. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/test_threads/test_lazy_errors.py +0 -0
  412. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/tests/utils.py +0 -0
  413. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/usage_tracking/__init__.py +0 -0
  414. {parsl-2023.10.16 → parsl-2023.11.13}/parsl/usage_tracking/usage.py +0 -0
  415. {parsl-2023.10.16 → parsl-2023.11.13}/parsl.egg-info/dependency_links.txt +0 -0
  416. {parsl-2023.10.16 → parsl-2023.11.13}/parsl.egg-info/entry_points.txt +0 -0
  417. {parsl-2023.10.16 → parsl-2023.11.13}/parsl.egg-info/top_level.txt +0 -0
  418. {parsl-2023.10.16 → parsl-2023.11.13}/requirements.txt +0 -0
  419. {parsl-2023.10.16 → parsl-2023.11.13}/setup.cfg +0 -0
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: parsl
3
- Version: 2023.10.16
3
+ Version: 2023.11.13
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/2023.10.16.tar.gz
6
+ Download-URL: https://github.com/Parsl/parsl/archive/2023.11.13.tar.gz
7
7
  Author: The Parsl Team
8
8
  Author-email: parsl@googlegroups.com
9
9
  License: Apache 2.0
@@ -17,6 +17,7 @@ Classifier: Programming Language :: Python :: 3.10
17
17
  Classifier: Programming Language :: Python :: 3.11
18
18
  Requires-Python: >=3.8.0
19
19
  Provides-Extra: monitoring
20
+ Provides-Extra: visualization
20
21
  Provides-Extra: aws
21
22
  Provides-Extra: kubernetes
22
23
  Provides-Extra: oauth_ssh
@@ -6,11 +6,16 @@ import logging
6
6
  import typeguard
7
7
  from abc import ABCMeta, abstractmethod
8
8
  from inspect import signature
9
- from typing import List, Optional, Union
9
+ from typing import List, Optional, Sequence, Union
10
10
  from typing_extensions import Literal
11
11
 
12
12
  from parsl.dataflow.dflow import DataFlowKernel
13
13
 
14
+ from typing import Any, Callable, Dict
15
+
16
+ from parsl.dataflow.futures import AppFuture
17
+
18
+
14
19
  logger = logging.getLogger(__name__)
15
20
 
16
21
 
@@ -22,7 +27,12 @@ class AppBase(metaclass=ABCMeta):
22
27
 
23
28
  """
24
29
 
25
- def __init__(self, func, data_flow_kernel=None, executors='all', cache=False, ignore_for_cache=None):
30
+ @typeguard.typechecked
31
+ def __init__(self, func: Callable,
32
+ data_flow_kernel: Optional[DataFlowKernel] = None,
33
+ executors: Union[List[str], Literal['all']] = 'all',
34
+ cache: bool = False,
35
+ ignore_for_cache: Optional[Sequence[str]] = None) -> None:
26
36
  """Construct the App object.
27
37
 
28
38
  Args:
@@ -34,7 +44,7 @@ class AppBase(metaclass=ABCMeta):
34
44
  after calling :meth:`parsl.dataflow.dflow.DataFlowKernelLoader.load`.
35
45
  - executors (str|list) : Labels of the executors that this app can execute over. Default is 'all'.
36
46
  - cache (Bool) : Enable caching of this app ?
37
- - ignore_for_cache (list|None): Names of arguments which will be ignored by the caching mechanism.
47
+ - ignore_for_cache (sequence|None): Names of arguments which will be ignored by the caching mechanism.
38
48
 
39
49
  Returns:
40
50
  - App object.
@@ -46,12 +56,10 @@ class AppBase(metaclass=ABCMeta):
46
56
  self.executors = executors
47
57
  self.cache = cache
48
58
  self.ignore_for_cache = ignore_for_cache
49
- if not (isinstance(executors, list) or isinstance(executors, str)):
50
- logger.error("App {} specifies invalid executor option, expects string or list".format(
51
- func.__name__))
52
59
 
53
60
  params = signature(func).parameters
54
61
 
62
+ self.kwargs: Dict[str, Any]
55
63
  self.kwargs = {}
56
64
  if 'stdout' in params:
57
65
  self.kwargs['stdout'] = params['stdout'].default
@@ -65,16 +73,16 @@ class AppBase(metaclass=ABCMeta):
65
73
  self.inputs = params['inputs'].default if 'inputs' in params else []
66
74
 
67
75
  @abstractmethod
68
- def __call__(self, *args, **kwargs):
76
+ def __call__(self, *args: Any, **kwargs: Any) -> AppFuture:
69
77
  pass
70
78
 
71
79
 
72
80
  @typeguard.typechecked
73
- def python_app(function=None,
81
+ def python_app(function: Optional[Callable] = None,
74
82
  data_flow_kernel: Optional[DataFlowKernel] = None,
75
83
  cache: bool = False,
76
84
  executors: Union[List[str], Literal['all']] = 'all',
77
- ignore_for_cache: Optional[List[str]] = None):
85
+ ignore_for_cache: Optional[Sequence[str]] = None) -> Callable:
78
86
  """Decorator function for making python apps.
79
87
 
80
88
  Parameters
@@ -91,13 +99,13 @@ def python_app(function=None,
91
99
  Labels of the executors that this app can execute over. Default is 'all'.
92
100
  cache : bool
93
101
  Enable caching of the app call. Default is False.
94
- ignore_for_cache : (list|None)
102
+ ignore_for_cache : (sequence|None)
95
103
  Names of arguments which will be ignored by the caching mechanism.
96
104
  """
97
105
  from parsl.app.python import PythonApp
98
106
 
99
- def decorator(func):
100
- def wrapper(f):
107
+ def decorator(func: Callable) -> Callable:
108
+ def wrapper(f: Callable) -> PythonApp:
101
109
  return PythonApp(f,
102
110
  data_flow_kernel=data_flow_kernel,
103
111
  cache=cache,
@@ -111,10 +119,10 @@ def python_app(function=None,
111
119
 
112
120
 
113
121
  @typeguard.typechecked
114
- def join_app(function=None,
122
+ def join_app(function: Optional[Callable] = None,
115
123
  data_flow_kernel: Optional[DataFlowKernel] = None,
116
124
  cache: bool = False,
117
- ignore_for_cache: Optional[List[str]] = None):
125
+ ignore_for_cache: Optional[Sequence[str]] = None) -> Callable:
118
126
  """Decorator function for making join apps
119
127
 
120
128
  Parameters
@@ -129,13 +137,13 @@ def join_app(function=None,
129
137
  be omitted only after calling :meth:`parsl.dataflow.dflow.DataFlowKernelLoader.load`. Default is None.
130
138
  cache : bool
131
139
  Enable caching of the app call. Default is False.
132
- ignore_for_cache : (list|None)
140
+ ignore_for_cache : (sequence|None)
133
141
  Names of arguments which will be ignored by the caching mechanism.
134
142
  """
135
143
  from parsl.app.python import PythonApp
136
144
 
137
- def decorator(func):
138
- def wrapper(f):
145
+ def decorator(func: Callable) -> Callable:
146
+ def wrapper(f: Callable) -> PythonApp:
139
147
  return PythonApp(f,
140
148
  data_flow_kernel=data_flow_kernel,
141
149
  cache=cache,
@@ -149,11 +157,11 @@ def join_app(function=None,
149
157
 
150
158
 
151
159
  @typeguard.typechecked
152
- def bash_app(function=None,
160
+ def bash_app(function: Optional[Callable] = None,
153
161
  data_flow_kernel: Optional[DataFlowKernel] = None,
154
162
  cache: bool = False,
155
163
  executors: Union[List[str], Literal['all']] = 'all',
156
- ignore_for_cache: Optional[List[str]] = None):
164
+ ignore_for_cache: Optional[Sequence[str]] = None) -> Callable:
157
165
  """Decorator function for making bash apps.
158
166
 
159
167
  Parameters
@@ -177,8 +185,8 @@ def bash_app(function=None,
177
185
  """
178
186
  from parsl.app.bash import BashApp
179
187
 
180
- def decorator(func):
181
- def wrapper(f):
188
+ def decorator(func: Callable) -> Callable:
189
+ def wrapper(f: Callable) -> BashApp:
182
190
  return BashApp(f,
183
191
  data_flow_kernel=data_flow_kernel,
184
192
  cache=cache,
@@ -4,33 +4,21 @@ from typing import Dict, Tuple
4
4
 
5
5
 
6
6
  class Channel(metaclass=ABCMeta):
7
- """For certain resources such as campus clusters or supercomputers at
7
+ """Channels are abstractions that enable ExecutionProviders to talk to
8
+ resource managers of remote compute facilities.
9
+
10
+ For certain resources such as campus clusters or supercomputers at
8
11
  research laboratories, resource requirements may require authentication.
9
12
  For instance some resources may allow access to their job schedulers from
10
- only their login-nodes which require you to authenticate on through SSH,
11
- GSI-SSH and sometimes even require two factor authentication. Channels are
12
- simple abstractions that enable the ExecutionProvider component to talk to
13
- the resource managers of compute facilities. The simplest Channel,
14
- *LocalChannel*, simply executes commands locally on a shell, while the
15
- *SshChannel* authenticates you to remote systems.
16
-
17
- Channels are usually called via the execute_wait function.
18
- For channels that execute remotely, a push_file function allows you to copy over files.
19
-
20
- .. code:: python
21
-
22
- +------------------
23
- |
24
- cmd, wtime ------->| execute_wait
25
- (ec, stdout, stderr)<-|---+
26
- |
27
- src, dst_dir ------->| push_file
28
- dst_path <--------|----+
29
- |
30
- dst_script_dir <------| script_dir
31
- |
32
- +-------------------
13
+ only their login-nodes which require you to authenticate through SSH, or
14
+ require two factor authentication.
15
+
16
+ The simplest Channel, *LocalChannel*, executes commands locally in a
17
+ shell, while the *SSHChannel* authenticates you to remote systems.
33
18
 
19
+ Channels provide the ability to execute commands remotely, using the
20
+ execute_wait method, and manipulate the remote file system using methods
21
+ such as push_file, pull_file and makedirs.
34
22
 
35
23
  Channels should ensure that each launched command runs in a new process
36
24
  group, so that providers (such as AdHocProvider and LocalProvider) which
@@ -1,7 +1,7 @@
1
1
  import logging
2
2
  import typeguard
3
3
 
4
- from typing import Callable, List, Optional, Sequence, Union
4
+ from typing import Callable, Iterable, Optional, Sequence, Union
5
5
  from typing_extensions import Literal
6
6
 
7
7
  from parsl.utils import RepresentationMixin
@@ -20,9 +20,9 @@ class Config(RepresentationMixin):
20
20
 
21
21
  Parameters
22
22
  ----------
23
- executors : list of ParslExecutor, optional
24
- List of `ParslExecutor` instances to use for executing tasks.
25
- Default is [:class:`~parsl.executors.threads.ThreadPoolExecutor()`].
23
+ executors : sequence of ParslExecutor, optional
24
+ List (or other iterable) of `ParslExecutor` instances to use for executing tasks.
25
+ Default is (:class:`~parsl.executors.threads.ThreadPoolExecutor()`,).
26
26
  app_cache : bool, optional
27
27
  Enable app caching. Default is True.
28
28
  checkpoint_files : sequence of str, optional
@@ -73,7 +73,7 @@ class Config(RepresentationMixin):
73
73
 
74
74
  @typeguard.typechecked
75
75
  def __init__(self,
76
- executors: Optional[List[ParslExecutor]] = None,
76
+ executors: Optional[Iterable[ParslExecutor]] = None,
77
77
  app_cache: bool = True,
78
78
  checkpoint_files: Optional[Sequence[str]] = None,
79
79
  checkpoint_mode: Union[None,
@@ -92,9 +92,14 @@ class Config(RepresentationMixin):
92
92
  monitoring: Optional[MonitoringHub] = None,
93
93
  usage_tracking: bool = False,
94
94
  initialize_logging: bool = True) -> None:
95
- if executors is None:
96
- executors = [ThreadPoolExecutor()]
97
- self.executors = executors
95
+
96
+ executors = tuple(executors or [])
97
+ if not executors:
98
+ executors = (ThreadPoolExecutor(),)
99
+
100
+ self._executors: Sequence[ParslExecutor] = executors
101
+ self._validate_executors()
102
+
98
103
  self.app_cache = app_cache
99
104
  self.checkpoint_files = checkpoint_files
100
105
  self.checkpoint_mode = checkpoint_mode
@@ -125,11 +130,13 @@ class Config(RepresentationMixin):
125
130
  def executors(self) -> Sequence[ParslExecutor]:
126
131
  return self._executors
127
132
 
128
- @executors.setter
129
- def executors(self, executors: Sequence[ParslExecutor]):
130
- labels = [e.label for e in executors]
133
+ def _validate_executors(self) -> None:
134
+
135
+ if len(self.executors) == 0:
136
+ raise ConfigurationError('At least one executor must be specified')
137
+
138
+ labels = [e.label for e in self.executors]
131
139
  duplicates = [e for n, e in enumerate(labels) if e in labels[:n]]
132
140
  if len(duplicates) > 0:
133
141
  raise ConfigurationError('Executors must have unique labels ({})'.format(
134
142
  ', '.join(['label={}'.format(repr(d)) for d in duplicates])))
135
- self._executors = executors
@@ -9,8 +9,8 @@ user_opts = {'adhoc':
9
9
  {'username': 'YOUR_USERNAME',
10
10
  'script_dir': 'YOUR_SCRIPT_DIR',
11
11
  'remote_hostnames': ['REMOTE_HOST_URL_1', 'REMOTE_HOST_URL_2']
12
+ }
12
13
  }
13
- }
14
14
 
15
15
 
16
16
  config = Config(
@@ -26,7 +26,7 @@ config = Config(
26
26
  channels=[SSHChannel(hostname=m,
27
27
  username=user_opts['adhoc']['username'],
28
28
  script_dir=user_opts['adhoc']['script_dir'],
29
- ) for m in user_opts['adhoc']['remote_hostnames']]
29
+ ) for m in user_opts['adhoc']['remote_hostnames']]
30
30
  )
31
31
  )
32
32
  ],
@@ -451,8 +451,8 @@ class DataFlowKernel:
451
451
  if isinstance(joinable, Future):
452
452
  je = joinable.exception()
453
453
  if je is not None:
454
- if hasattr(joinable, 'task_def'):
455
- tid = joinable.task_def['id']
454
+ if hasattr(joinable, 'task_record'):
455
+ tid = joinable.task_record['id']
456
456
  else:
457
457
  tid = None
458
458
  exceptions_tids = [(je, tid)]
@@ -460,8 +460,8 @@ class DataFlowKernel:
460
460
  for future in joinable:
461
461
  je = future.exception()
462
462
  if je is not None:
463
- if hasattr(joinable, 'task_def'):
464
- tid = joinable.task_def['id']
463
+ if hasattr(joinable, 'task_record'):
464
+ tid = joinable.task_record['id']
465
465
  else:
466
466
  tid = None
467
467
  exceptions_tids.append((je, tid))
@@ -854,8 +854,8 @@ class DataFlowKernel:
854
854
  try:
855
855
  new_args.extend([dep.result()])
856
856
  except Exception as e:
857
- if hasattr(dep, 'task_def'):
858
- tid = dep.task_def['id']
857
+ if hasattr(dep, 'task_record'):
858
+ tid = dep.task_record['id']
859
859
  else:
860
860
  tid = None
861
861
  dep_failures.extend([(e, tid)])
@@ -869,8 +869,8 @@ class DataFlowKernel:
869
869
  try:
870
870
  kwargs[key] = dep.result()
871
871
  except Exception as e:
872
- if hasattr(dep, 'task_def'):
873
- tid = dep.task_def['id']
872
+ if hasattr(dep, 'task_record'):
873
+ tid = dep.task_record['id']
874
874
  else:
875
875
  tid = None
876
876
  dep_failures.extend([(e, tid)])
@@ -883,8 +883,8 @@ class DataFlowKernel:
883
883
  try:
884
884
  new_inputs.extend([dep.result()])
885
885
  except Exception as e:
886
- if hasattr(dep, 'task_def'):
887
- tid = dep.task_def['id']
886
+ if hasattr(dep, 'task_record'):
887
+ tid = dep.task_record['id']
888
888
  else:
889
889
  tid = None
890
890
  dep_failures.extend([(e, tid)])
@@ -918,7 +918,7 @@ class DataFlowKernel:
918
918
  - executors (list or string) : List of executors this call could go to.
919
919
  Default='all'
920
920
  - cache (Bool) : To enable memoization or not
921
- - ignore_for_cache (list) : List of kwargs to be ignored for memoization/checkpointing
921
+ - ignore_for_cache (sequence) : List of kwargs to be ignored for memoization/checkpointing
922
922
  - app_kwargs (dict) : Rest of the kwargs to the fn passed as dict.
923
923
 
924
924
  Returns:
@@ -967,38 +967,40 @@ class DataFlowKernel:
967
967
 
968
968
  resource_specification = app_kwargs.get('parsl_resource_specification', {})
969
969
 
970
- task_def: TaskRecord
971
- task_def = {'depends': [],
972
- 'executor': executor,
973
- 'func_name': func.__name__,
974
- 'memoize': cache,
975
- 'hashsum': None,
976
- 'exec_fu': None,
977
- 'fail_count': 0,
978
- 'fail_cost': 0,
979
- 'fail_history': [],
980
- 'from_memo': None,
981
- 'ignore_for_cache': ignore_for_cache,
982
- 'join': join,
983
- 'joins': None,
984
- 'try_id': 0,
985
- 'id': task_id,
986
- 'time_invoked': datetime.datetime.now(),
987
- 'time_returned': None,
988
- 'try_time_launched': None,
989
- 'try_time_returned': None,
990
- 'resource_specification': resource_specification}
991
-
992
- self.update_task_state(task_def, States.unsched)
993
-
994
- app_fu = AppFuture(task_def)
970
+ task_record: TaskRecord
971
+ task_record = {'depends': [],
972
+ 'dfk': self,
973
+ 'executor': executor,
974
+ 'func_name': func.__name__,
975
+ 'memoize': cache,
976
+ 'hashsum': None,
977
+ 'exec_fu': None,
978
+ 'fail_count': 0,
979
+ 'fail_cost': 0,
980
+ 'fail_history': [],
981
+ 'from_memo': None,
982
+ 'ignore_for_cache': ignore_for_cache,
983
+ 'join': join,
984
+ 'joins': None,
985
+ 'try_id': 0,
986
+ 'id': task_id,
987
+ 'task_launch_lock': threading.Lock(),
988
+ 'time_invoked': datetime.datetime.now(),
989
+ 'time_returned': None,
990
+ 'try_time_launched': None,
991
+ 'try_time_returned': None,
992
+ 'resource_specification': resource_specification}
993
+
994
+ self.update_task_state(task_record, States.unsched)
995
+
996
+ app_fu = AppFuture(task_record)
995
997
 
996
998
  # Transform remote input files to data futures
997
999
  app_args, app_kwargs, func = self._add_input_deps(executor, app_args, app_kwargs, func)
998
1000
 
999
1001
  func = self._add_output_deps(executor, app_args, app_kwargs, app_fu, func)
1000
1002
 
1001
- task_def.update({
1003
+ task_record.update({
1002
1004
  'args': app_args,
1003
1005
  'func': func,
1004
1006
  'kwargs': app_kwargs,
@@ -1006,11 +1008,11 @@ class DataFlowKernel:
1006
1008
 
1007
1009
  assert task_id not in self.tasks
1008
1010
 
1009
- self.tasks[task_id] = task_def
1011
+ self.tasks[task_id] = task_record
1010
1012
 
1011
1013
  # Get the list of dependencies for the task
1012
1014
  depends = self._gather_all_deps(app_args, app_kwargs)
1013
- task_def['depends'] = depends
1015
+ task_record['depends'] = depends
1014
1016
 
1015
1017
  depend_descs = []
1016
1018
  for d in depends:
@@ -1025,16 +1027,14 @@ class DataFlowKernel:
1025
1027
  waiting_message = "not waiting on any dependency"
1026
1028
 
1027
1029
  logger.info("Task {} submitted for App {}, {}".format(task_id,
1028
- task_def['func_name'],
1030
+ task_record['func_name'],
1029
1031
  waiting_message))
1030
1032
 
1031
- task_def['task_launch_lock'] = threading.Lock()
1033
+ app_fu.add_done_callback(partial(self.handle_app_update, task_record))
1034
+ self.update_task_state(task_record, States.pending)
1035
+ logger.debug("Task {} set to pending state with AppFuture: {}".format(task_id, task_record['app_fu']))
1032
1036
 
1033
- app_fu.add_done_callback(partial(self.handle_app_update, task_def))
1034
- self.update_task_state(task_def, States.pending)
1035
- logger.debug("Task {} set to pending state with AppFuture: {}".format(task_id, task_def['app_fu']))
1036
-
1037
- self._send_task_log_info(task_def)
1037
+ self._send_task_log_info(task_record)
1038
1038
 
1039
1039
  # at this point add callbacks to all dependencies to do a launch_if_ready
1040
1040
  # call whenever a dependency completes.
@@ -1051,14 +1051,14 @@ class DataFlowKernel:
1051
1051
  for d in depends:
1052
1052
 
1053
1053
  def callback_adapter(dep_fut: Future) -> None:
1054
- self.launch_if_ready(task_def)
1054
+ self.launch_if_ready(task_record)
1055
1055
 
1056
1056
  try:
1057
1057
  d.add_done_callback(callback_adapter)
1058
1058
  except Exception as e:
1059
1059
  logger.error("add_done_callback got an exception {} which will be ignored".format(e))
1060
1060
 
1061
- self.launch_if_ready(task_def)
1061
+ self.launch_if_ready(task_record)
1062
1062
 
1063
1063
  return app_fu
1064
1064
 
@@ -1090,7 +1090,14 @@ class DataFlowKernel:
1090
1090
  """
1091
1091
  run_dir = self.run_dir
1092
1092
  if channel.script_dir is None:
1093
- channel.script_dir = os.path.join(run_dir, 'submit_scripts')
1093
+
1094
+ # This case will be detected as unreachable by mypy, because of
1095
+ # the type of script_dir, which is str, not Optional[str].
1096
+ # The type system doesn't represent the initialized/uninitialized
1097
+ # state of a channel so cannot represent that a channel needs
1098
+ # its script directory set or not.
1099
+
1100
+ channel.script_dir = os.path.join(run_dir, 'submit_scripts') # type: ignore[unreachable]
1094
1101
 
1095
1102
  # Only create dirs if we aren't on a shared-fs
1096
1103
  if not channel.isdir(run_dir):
@@ -5,11 +5,14 @@ We have two basic types of futures:
5
5
  2. AppFutures which represent the futures on App/Leaf tasks.
6
6
 
7
7
  """
8
+ from __future__ import annotations
8
9
 
9
10
  from concurrent.futures import Future
10
11
  import logging
11
12
  import threading
12
- from typing import Optional, Sequence
13
+ from typing import Any, Optional, Sequence
14
+
15
+ import parsl.app.app as app
13
16
 
14
17
  from parsl.app.futures import DataFuture
15
18
  from parsl.dataflow.taskrecord import TaskRecord
@@ -59,32 +62,32 @@ class AppFuture(Future):
59
62
 
60
63
  """
61
64
 
62
- def __init__(self, task_def: TaskRecord) -> None:
65
+ def __init__(self, task_record: TaskRecord) -> None:
63
66
  """Initialize the AppFuture.
64
67
 
65
68
  Args:
66
69
 
67
70
  KWargs:
68
- - task_def : The DFK task definition dictionary for the task represented
69
- by this future.
71
+ - task_record : The TaskRecord for the task represented by
72
+ this future.
70
73
  """
71
74
  super().__init__()
72
75
  self._update_lock = threading.Lock()
73
76
  self._outputs: Sequence[DataFuture]
74
77
  self._outputs = []
75
- self.task_def = task_def
78
+ self.task_record = task_record
76
79
 
77
80
  @property
78
81
  def stdout(self) -> Optional[str]:
79
- return self.task_def['kwargs'].get('stdout')
82
+ return self.task_record['kwargs'].get('stdout')
80
83
 
81
84
  @property
82
85
  def stderr(self) -> Optional[str]:
83
- return self.task_def['kwargs'].get('stderr')
86
+ return self.task_record['kwargs'].get('stderr')
84
87
 
85
88
  @property
86
89
  def tid(self) -> int:
87
- return self.task_def['id']
90
+ return self.task_record['id']
88
91
 
89
92
  def cancel(self) -> bool:
90
93
  raise NotImplementedError("Cancel not implemented")
@@ -113,8 +116,35 @@ class AppFuture(Future):
113
116
 
114
117
  Returns: str
115
118
  """
116
- return self.task_def['status'].name
119
+ return self.task_record['status'].name
117
120
 
118
121
  @property
119
122
  def outputs(self) -> Sequence[DataFuture]:
120
123
  return self._outputs
124
+
125
+ def __getitem__(self, key: Any) -> AppFuture:
126
+ # This is decorated on each invocation because the getitem task
127
+ # should be bound to the same DFK as the task associated with this
128
+ # Future.
129
+ deferred_getitem_app = app.python_app(deferred_getitem, executors=['_parsl_internal'], data_flow_kernel=self.task_record['dfk'])
130
+
131
+ return deferred_getitem_app(self, key)
132
+
133
+ def __getattr__(self, name: str) -> AppFuture:
134
+ # this will avoid lifting behaviour on private methods and attributes,
135
+ # including __double_underscore__ methods which implement other
136
+ # Python syntax (such as iterators in for loops)
137
+ if name.startswith("_"):
138
+ raise AttributeError()
139
+
140
+ deferred_getattr_app = app.python_app(deferred_getattr, executors=['_parsl_internal'], data_flow_kernel=self.task_record['dfk'])
141
+
142
+ return deferred_getattr_app(self, name)
143
+
144
+
145
+ def deferred_getitem(o: Any, k: Any) -> Any:
146
+ return o[k]
147
+
148
+
149
+ def deferred_getattr(o: Any, name: str) -> Any:
150
+ return getattr(o, name)
@@ -5,18 +5,25 @@ import datetime
5
5
  from typing_extensions import TypedDict
6
6
  from concurrent.futures import Future
7
7
 
8
+
8
9
  # only for type checking:
9
10
  from typing import Any, Callable, Dict, Optional, List, Sequence, TYPE_CHECKING, Union
10
11
 
11
12
  if TYPE_CHECKING:
12
13
  from parsl.dataflow.futures import AppFuture
13
14
 
15
+ import parsl.dataflow.dflow as dflow
16
+
14
17
  from parsl.dataflow.states import States
15
18
 
16
19
 
17
20
  class TaskRecord(TypedDict, total=False):
18
21
  """This stores most information about a Parsl task"""
19
22
 
23
+ dfk: dflow.DataFlowKernel
24
+ """The DataFlowKernel which is managing this task.
25
+ """
26
+
20
27
  func_name: str
21
28
 
22
29
  status: States
@@ -74,7 +74,7 @@ class ParslExecutor(metaclass=ABCMeta):
74
74
  pass
75
75
 
76
76
  @abstractmethod
77
- def shutdown(self) -> bool:
77
+ def shutdown(self) -> None:
78
78
  """Shutdown the executor.
79
79
 
80
80
  This includes all attached resources such as workers and controllers.
@@ -479,10 +479,10 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin):
479
479
  "heartbeat_threshold": self.heartbeat_threshold,
480
480
  "poll_period": self.poll_period,
481
481
  "logging_level": logging.DEBUG if self.worker_debug else logging.INFO
482
- },
482
+ },
483
483
  daemon=True,
484
484
  name="HTEX-Interchange"
485
- )
485
+ )
486
486
  self.interchange_proc.start()
487
487
  try:
488
488
  (self.worker_task_port, self.worker_result_port) = comm_q.get(block=True, timeout=120)