parsl 2024.3.11__py3-none-any.whl → 2025.1.13__py3-none-any.whl

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 (369) hide show
  1. parsl/__init__.py +9 -10
  2. parsl/addresses.py +29 -7
  3. parsl/app/app.py +7 -8
  4. parsl/app/bash.py +15 -8
  5. parsl/app/errors.py +10 -13
  6. parsl/app/futures.py +8 -10
  7. parsl/app/python.py +2 -1
  8. parsl/benchmark/perf.py +2 -1
  9. parsl/concurrent/__init__.py +2 -2
  10. parsl/config.py +57 -10
  11. parsl/configs/ASPIRE1.py +6 -5
  12. parsl/configs/Azure.py +9 -8
  13. parsl/configs/bridges.py +6 -4
  14. parsl/configs/cc_in2p3.py +3 -3
  15. parsl/configs/ec2.py +3 -1
  16. parsl/configs/expanse.py +4 -3
  17. parsl/configs/frontera.py +3 -4
  18. parsl/configs/htex_local.py +3 -4
  19. parsl/configs/illinoiscluster.py +3 -1
  20. parsl/configs/improv.py +34 -0
  21. parsl/configs/kubernetes.py +4 -3
  22. parsl/configs/local_threads.py +5 -1
  23. parsl/configs/midway.py +5 -3
  24. parsl/configs/osg.py +4 -2
  25. parsl/configs/polaris.py +4 -2
  26. parsl/configs/stampede2.py +6 -5
  27. parsl/configs/summit.py +3 -3
  28. parsl/configs/toss3_llnl.py +4 -3
  29. parsl/configs/vineex_local.py +6 -4
  30. parsl/configs/wqex_local.py +5 -3
  31. parsl/curvezmq.py +4 -0
  32. parsl/data_provider/data_manager.py +4 -3
  33. parsl/data_provider/file_noop.py +1 -2
  34. parsl/data_provider/files.py +3 -3
  35. parsl/data_provider/ftp.py +1 -3
  36. parsl/data_provider/globus.py +7 -6
  37. parsl/data_provider/http.py +2 -2
  38. parsl/data_provider/rsync.py +1 -1
  39. parsl/data_provider/staging.py +2 -2
  40. parsl/data_provider/zip.py +135 -0
  41. parsl/dataflow/dependency_resolvers.py +115 -0
  42. parsl/dataflow/dflow.py +262 -224
  43. parsl/dataflow/errors.py +3 -5
  44. parsl/dataflow/futures.py +27 -14
  45. parsl/dataflow/memoization.py +5 -5
  46. parsl/dataflow/rundirs.py +5 -6
  47. parsl/dataflow/taskrecord.py +4 -5
  48. parsl/executors/__init__.py +4 -2
  49. parsl/executors/base.py +45 -15
  50. parsl/executors/errors.py +13 -0
  51. parsl/executors/execute_task.py +37 -0
  52. parsl/executors/flux/execute_parsl_task.py +3 -3
  53. parsl/executors/flux/executor.py +18 -19
  54. parsl/executors/flux/flux_instance_manager.py +26 -27
  55. parsl/executors/high_throughput/errors.py +43 -3
  56. parsl/executors/high_throughput/executor.py +316 -282
  57. parsl/executors/high_throughput/interchange.py +158 -167
  58. parsl/executors/high_throughput/manager_record.py +5 -0
  59. parsl/executors/high_throughput/manager_selector.py +55 -0
  60. parsl/executors/high_throughput/monitoring_info.py +2 -1
  61. parsl/executors/high_throughput/mpi_executor.py +113 -0
  62. parsl/executors/high_throughput/mpi_prefix_composer.py +10 -11
  63. parsl/executors/high_throughput/mpi_resource_management.py +6 -17
  64. parsl/executors/high_throughput/probe.py +9 -7
  65. parsl/executors/high_throughput/process_worker_pool.py +115 -77
  66. parsl/executors/high_throughput/zmq_pipes.py +81 -23
  67. parsl/executors/radical/executor.py +130 -79
  68. parsl/executors/radical/rpex_resources.py +17 -15
  69. parsl/executors/radical/rpex_worker.py +4 -3
  70. parsl/executors/status_handling.py +157 -51
  71. parsl/executors/taskvine/__init__.py +1 -1
  72. parsl/executors/taskvine/errors.py +1 -1
  73. parsl/executors/taskvine/exec_parsl_function.py +2 -2
  74. parsl/executors/taskvine/executor.py +41 -57
  75. parsl/executors/taskvine/factory.py +1 -1
  76. parsl/executors/taskvine/factory_config.py +1 -1
  77. parsl/executors/taskvine/manager.py +18 -13
  78. parsl/executors/taskvine/manager_config.py +9 -5
  79. parsl/executors/threads.py +6 -6
  80. parsl/executors/workqueue/errors.py +1 -1
  81. parsl/executors/workqueue/exec_parsl_function.py +6 -5
  82. parsl/executors/workqueue/executor.py +64 -63
  83. parsl/executors/workqueue/parsl_coprocess.py +1 -1
  84. parsl/jobs/error_handlers.py +2 -2
  85. parsl/jobs/job_status_poller.py +30 -113
  86. parsl/jobs/states.py +7 -2
  87. parsl/jobs/strategy.py +43 -31
  88. parsl/launchers/__init__.py +12 -3
  89. parsl/launchers/errors.py +1 -1
  90. parsl/launchers/launchers.py +6 -12
  91. parsl/log_utils.py +9 -6
  92. parsl/monitoring/db_manager.py +59 -95
  93. parsl/monitoring/errors.py +6 -0
  94. parsl/monitoring/monitoring.py +87 -356
  95. parsl/monitoring/queries/pandas.py +1 -2
  96. parsl/monitoring/radios/base.py +13 -0
  97. parsl/monitoring/radios/filesystem.py +52 -0
  98. parsl/monitoring/radios/htex.py +57 -0
  99. parsl/monitoring/radios/multiprocessing.py +17 -0
  100. parsl/monitoring/radios/udp.py +56 -0
  101. parsl/monitoring/radios/zmq.py +17 -0
  102. parsl/monitoring/remote.py +33 -37
  103. parsl/monitoring/router.py +212 -0
  104. parsl/monitoring/types.py +5 -6
  105. parsl/monitoring/visualization/app.py +4 -2
  106. parsl/monitoring/visualization/models.py +0 -1
  107. parsl/monitoring/visualization/plots/default/workflow_plots.py +11 -4
  108. parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +1 -0
  109. parsl/monitoring/visualization/utils.py +0 -1
  110. parsl/monitoring/visualization/views.py +16 -8
  111. parsl/multiprocessing.py +0 -1
  112. parsl/process_loggers.py +1 -2
  113. parsl/providers/__init__.py +8 -17
  114. parsl/providers/aws/aws.py +2 -3
  115. parsl/providers/azure/azure.py +4 -5
  116. parsl/providers/base.py +2 -18
  117. parsl/providers/cluster_provider.py +4 -12
  118. parsl/providers/condor/condor.py +7 -17
  119. parsl/providers/errors.py +2 -2
  120. parsl/providers/googlecloud/googlecloud.py +2 -1
  121. parsl/providers/grid_engine/grid_engine.py +5 -14
  122. parsl/providers/kubernetes/kube.py +80 -40
  123. parsl/providers/local/local.py +13 -26
  124. parsl/providers/lsf/lsf.py +5 -23
  125. parsl/providers/pbspro/pbspro.py +5 -17
  126. parsl/providers/slurm/slurm.py +81 -39
  127. parsl/providers/torque/torque.py +3 -14
  128. parsl/serialize/__init__.py +8 -3
  129. parsl/serialize/base.py +1 -2
  130. parsl/serialize/concretes.py +5 -4
  131. parsl/serialize/facade.py +3 -3
  132. parsl/serialize/proxystore.py +3 -2
  133. parsl/tests/__init__.py +1 -1
  134. parsl/tests/configs/azure_single_node.py +4 -5
  135. parsl/tests/configs/bridges.py +3 -2
  136. parsl/tests/configs/cc_in2p3.py +1 -3
  137. parsl/tests/configs/comet.py +2 -1
  138. parsl/tests/configs/ec2_single_node.py +1 -2
  139. parsl/tests/configs/ec2_spot.py +1 -2
  140. parsl/tests/configs/flux_local.py +11 -0
  141. parsl/tests/configs/frontera.py +2 -3
  142. parsl/tests/configs/htex_local.py +3 -5
  143. parsl/tests/configs/htex_local_alternate.py +11 -15
  144. parsl/tests/configs/htex_local_intask_staging.py +5 -9
  145. parsl/tests/configs/htex_local_rsync_staging.py +4 -8
  146. parsl/tests/configs/local_radical.py +1 -3
  147. parsl/tests/configs/local_radical_mpi.py +2 -2
  148. parsl/tests/configs/local_threads_checkpoint_periodic.py +8 -10
  149. parsl/tests/configs/local_threads_monitoring.py +0 -1
  150. parsl/tests/configs/midway.py +2 -2
  151. parsl/tests/configs/nscc_singapore.py +3 -3
  152. parsl/tests/configs/osg_htex.py +1 -1
  153. parsl/tests/configs/petrelkube.py +3 -2
  154. parsl/tests/configs/slurm_local.py +24 -0
  155. parsl/tests/configs/summit.py +1 -0
  156. parsl/tests/configs/taskvine_ex.py +4 -7
  157. parsl/tests/configs/user_opts.py +2 -8
  158. parsl/tests/configs/workqueue_ex.py +4 -6
  159. parsl/tests/conftest.py +27 -13
  160. parsl/tests/integration/test_stress/test_python_simple.py +3 -4
  161. parsl/tests/integration/test_stress/test_python_threads.py +3 -5
  162. parsl/tests/manual_tests/htex_local.py +4 -6
  163. parsl/tests/manual_tests/test_basic.py +1 -0
  164. parsl/tests/manual_tests/test_log_filter.py +3 -1
  165. parsl/tests/manual_tests/test_memory_limits.py +6 -8
  166. parsl/tests/manual_tests/test_regression_220.py +2 -1
  167. parsl/tests/manual_tests/test_udp_simple.py +4 -4
  168. parsl/tests/manual_tests/test_worker_count.py +3 -2
  169. parsl/tests/scaling_tests/htex_local.py +2 -4
  170. parsl/tests/scaling_tests/test_scale.py +0 -9
  171. parsl/tests/scaling_tests/vineex_condor.py +1 -2
  172. parsl/tests/scaling_tests/vineex_local.py +1 -2
  173. parsl/tests/site_tests/site_config_selector.py +1 -6
  174. parsl/tests/site_tests/test_provider.py +4 -2
  175. parsl/tests/site_tests/test_site.py +2 -0
  176. parsl/tests/sites/test_affinity.py +7 -7
  177. parsl/tests/sites/test_dynamic_executor.py +3 -4
  178. parsl/tests/sites/test_ec2.py +3 -2
  179. parsl/tests/sites/test_worker_info.py +4 -5
  180. parsl/tests/test_aalst_patterns.py +0 -1
  181. parsl/tests/test_bash_apps/test_apptimeout.py +2 -2
  182. parsl/tests/test_bash_apps/test_basic.py +10 -4
  183. parsl/tests/test_bash_apps/test_error_codes.py +5 -7
  184. parsl/tests/test_bash_apps/test_inputs_default.py +25 -0
  185. parsl/tests/test_bash_apps/test_kwarg_storage.py +1 -1
  186. parsl/tests/test_bash_apps/test_memoize.py +2 -8
  187. parsl/tests/test_bash_apps/test_memoize_ignore_args.py +9 -14
  188. parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +9 -14
  189. parsl/tests/test_bash_apps/test_multiline.py +1 -1
  190. parsl/tests/test_bash_apps/test_pipeline.py +1 -1
  191. parsl/tests/test_bash_apps/test_std_uri.py +123 -0
  192. parsl/tests/test_bash_apps/test_stdout.py +33 -8
  193. parsl/tests/test_callables.py +2 -2
  194. parsl/tests/test_checkpointing/test_periodic.py +21 -39
  195. parsl/tests/test_checkpointing/test_python_checkpoint_1.py +1 -0
  196. parsl/tests/test_checkpointing/test_python_checkpoint_2.py +2 -2
  197. parsl/tests/test_checkpointing/test_python_checkpoint_3.py +0 -1
  198. parsl/tests/test_checkpointing/test_regression_239.py +1 -1
  199. parsl/tests/test_checkpointing/test_task_exit.py +2 -3
  200. parsl/tests/test_docs/test_from_slides.py +5 -2
  201. parsl/tests/test_docs/test_kwargs.py +4 -1
  202. parsl/tests/test_docs/test_tutorial_1.py +1 -2
  203. parsl/tests/test_docs/test_workflow1.py +2 -2
  204. parsl/tests/test_docs/test_workflow2.py +0 -1
  205. parsl/tests/test_error_handling/test_rand_fail.py +2 -2
  206. parsl/tests/test_error_handling/test_resource_spec.py +10 -12
  207. parsl/tests/test_error_handling/test_retries.py +6 -16
  208. parsl/tests/test_error_handling/test_retry_handler.py +1 -0
  209. parsl/tests/test_error_handling/test_retry_handler_failure.py +2 -1
  210. parsl/tests/test_error_handling/test_serialization_fail.py +1 -1
  211. parsl/tests/test_error_handling/test_wrap_with_logs.py +1 -0
  212. parsl/tests/test_execute_task.py +29 -0
  213. parsl/tests/test_flux.py +1 -1
  214. parsl/tests/test_htex/test_basic.py +2 -3
  215. parsl/tests/test_htex/test_block_manager_selector_unit.py +20 -0
  216. parsl/tests/test_htex/test_command_client_timeout.py +66 -0
  217. parsl/tests/test_htex/test_connected_blocks.py +3 -2
  218. parsl/tests/test_htex/test_cpu_affinity_explicit.py +6 -10
  219. parsl/tests/test_htex/test_disconnected_blocks.py +6 -5
  220. parsl/tests/test_htex/test_disconnected_blocks_failing_provider.py +71 -0
  221. parsl/tests/test_htex/test_drain.py +79 -0
  222. parsl/tests/test_htex/test_htex.py +51 -25
  223. parsl/tests/test_htex/test_manager_failure.py +0 -1
  224. parsl/tests/test_htex/test_manager_selector_by_block.py +51 -0
  225. parsl/tests/test_htex/test_managers_command.py +36 -0
  226. parsl/tests/test_htex/test_missing_worker.py +2 -12
  227. parsl/tests/test_htex/test_multiple_disconnected_blocks.py +9 -9
  228. parsl/tests/test_htex/test_resource_spec_validation.py +45 -0
  229. parsl/tests/test_htex/test_zmq_binding.py +29 -8
  230. parsl/tests/test_monitoring/test_app_names.py +86 -0
  231. parsl/tests/test_monitoring/test_basic.py +73 -25
  232. parsl/tests/test_monitoring/test_db_locks.py +6 -4
  233. parsl/tests/test_monitoring/test_fuzz_zmq.py +19 -8
  234. parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +80 -0
  235. parsl/tests/test_monitoring/test_incomplete_futures.py +5 -4
  236. parsl/tests/test_monitoring/test_memoization_representation.py +4 -2
  237. parsl/tests/test_monitoring/test_stdouterr.py +134 -0
  238. parsl/tests/test_monitoring/test_viz_colouring.py +1 -0
  239. parsl/tests/test_mpi_apps/test_bad_mpi_config.py +33 -26
  240. parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +28 -11
  241. parsl/tests/test_mpi_apps/test_mpi_prefix.py +4 -4
  242. parsl/tests/test_mpi_apps/test_mpi_scheduler.py +7 -2
  243. parsl/tests/test_mpi_apps/test_mpiex.py +64 -0
  244. parsl/tests/test_mpi_apps/test_resource_spec.py +42 -49
  245. parsl/tests/test_providers/test_kubernetes_provider.py +102 -0
  246. parsl/tests/test_providers/test_local_provider.py +3 -132
  247. parsl/tests/test_providers/test_pbspro_template.py +2 -3
  248. parsl/tests/test_providers/test_slurm_template.py +2 -3
  249. parsl/tests/test_providers/test_submiterror_deprecation.py +2 -1
  250. parsl/tests/test_python_apps/test_context_manager.py +128 -0
  251. parsl/tests/test_python_apps/test_dep_standard_futures.py +2 -1
  252. parsl/tests/test_python_apps/test_dependencies_deep.py +59 -0
  253. parsl/tests/test_python_apps/test_fail.py +0 -25
  254. parsl/tests/test_python_apps/test_futures.py +2 -1
  255. parsl/tests/test_python_apps/test_inputs_default.py +22 -0
  256. parsl/tests/test_python_apps/test_join.py +0 -1
  257. parsl/tests/test_python_apps/test_lifted.py +11 -7
  258. parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +1 -0
  259. parsl/tests/test_python_apps/test_outputs.py +1 -1
  260. parsl/tests/test_python_apps/test_pluggable_future_resolution.py +161 -0
  261. parsl/tests/test_radical/test_mpi_funcs.py +1 -2
  262. parsl/tests/test_regression/test_1480.py +2 -1
  263. parsl/tests/test_regression/test_1653.py +2 -1
  264. parsl/tests/test_regression/test_226.py +1 -0
  265. parsl/tests/test_regression/test_2652.py +1 -0
  266. parsl/tests/test_regression/test_69a.py +0 -1
  267. parsl/tests/test_regression/test_854.py +4 -2
  268. parsl/tests/test_regression/test_97_parallelism_0.py +1 -2
  269. parsl/tests/test_regression/test_98.py +0 -1
  270. parsl/tests/test_scaling/test_block_error_handler.py +9 -4
  271. parsl/tests/test_scaling/test_regression_1621.py +11 -15
  272. parsl/tests/test_scaling/test_regression_3568_scaledown_vs_MISSING.py +84 -0
  273. parsl/tests/test_scaling/test_regression_3696_oscillation.py +103 -0
  274. parsl/tests/test_scaling/test_scale_down.py +2 -5
  275. parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +6 -18
  276. parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +71 -0
  277. parsl/tests/test_scaling/test_shutdown_scalein.py +73 -0
  278. parsl/tests/test_scaling/test_worker_interchange_bad_messages_3262.py +90 -0
  279. parsl/tests/test_serialization/test_2555_caching_deserializer.py +1 -1
  280. parsl/tests/test_serialization/test_3495_deserialize_managerlost.py +47 -0
  281. parsl/tests/test_serialization/test_basic.py +2 -1
  282. parsl/tests/test_serialization/test_htex_code_cache.py +3 -4
  283. parsl/tests/test_serialization/test_pack_resource_spec.py +2 -1
  284. parsl/tests/test_serialization/test_proxystore_configured.py +10 -6
  285. parsl/tests/test_serialization/test_proxystore_impl.py +5 -3
  286. parsl/tests/test_shutdown/test_kill_monitoring.py +64 -0
  287. parsl/tests/test_staging/staging_provider.py +2 -2
  288. parsl/tests/test_staging/test_1316.py +3 -4
  289. parsl/tests/test_staging/test_docs_1.py +2 -1
  290. parsl/tests/test_staging/test_docs_2.py +2 -1
  291. parsl/tests/test_staging/test_elaborate_noop_file.py +2 -3
  292. parsl/tests/{test_data → test_staging}/test_file.py +6 -6
  293. parsl/tests/{test_data → test_staging}/test_output_chain_filenames.py +3 -0
  294. parsl/tests/test_staging/test_staging_ftp.py +1 -0
  295. parsl/tests/test_staging/test_staging_https.py +5 -2
  296. parsl/tests/test_staging/test_staging_stdout.py +64 -0
  297. parsl/tests/test_staging/test_zip_in.py +39 -0
  298. parsl/tests/test_staging/test_zip_out.py +110 -0
  299. parsl/tests/test_staging/test_zip_to_zip.py +41 -0
  300. parsl/tests/test_summary.py +2 -2
  301. parsl/tests/test_thread_parallelism.py +0 -1
  302. parsl/tests/test_threads/test_configs.py +1 -2
  303. parsl/tests/test_threads/test_lazy_errors.py +2 -2
  304. parsl/tests/test_utils/test_execute_wait.py +35 -0
  305. parsl/tests/test_utils/test_sanitize_dns.py +76 -0
  306. parsl/tests/unit/test_address.py +20 -0
  307. parsl/tests/unit/test_file.py +99 -0
  308. parsl/tests/unit/test_usage_tracking.py +66 -0
  309. parsl/usage_tracking/api.py +65 -0
  310. parsl/usage_tracking/levels.py +6 -0
  311. parsl/usage_tracking/usage.py +104 -62
  312. parsl/utils.py +139 -6
  313. parsl/version.py +1 -1
  314. {parsl-2024.3.11.data → parsl-2025.1.13.data}/scripts/exec_parsl_function.py +6 -5
  315. parsl-2025.1.13.data/scripts/interchange.py +649 -0
  316. {parsl-2024.3.11.data → parsl-2025.1.13.data}/scripts/process_worker_pool.py +115 -77
  317. parsl-2025.1.13.dist-info/METADATA +96 -0
  318. parsl-2025.1.13.dist-info/RECORD +462 -0
  319. {parsl-2024.3.11.dist-info → parsl-2025.1.13.dist-info}/WHEEL +1 -1
  320. parsl/channels/__init__.py +0 -7
  321. parsl/channels/base.py +0 -141
  322. parsl/channels/errors.py +0 -113
  323. parsl/channels/local/local.py +0 -164
  324. parsl/channels/oauth_ssh/oauth_ssh.py +0 -110
  325. parsl/channels/ssh/ssh.py +0 -276
  326. parsl/channels/ssh_il/__init__.py +0 -0
  327. parsl/channels/ssh_il/ssh_il.py +0 -74
  328. parsl/configs/ad_hoc.py +0 -35
  329. parsl/executors/radical/rpex_master.py +0 -42
  330. parsl/monitoring/radios.py +0 -175
  331. parsl/providers/ad_hoc/__init__.py +0 -0
  332. parsl/providers/ad_hoc/ad_hoc.py +0 -248
  333. parsl/providers/cobalt/__init__.py +0 -0
  334. parsl/providers/cobalt/cobalt.py +0 -236
  335. parsl/providers/cobalt/template.py +0 -17
  336. parsl/tests/configs/ad_hoc_cluster_htex.py +0 -35
  337. parsl/tests/configs/cooley_htex.py +0 -37
  338. parsl/tests/configs/htex_ad_hoc_cluster.py +0 -28
  339. parsl/tests/configs/local_adhoc.py +0 -18
  340. parsl/tests/configs/swan_htex.py +0 -43
  341. parsl/tests/configs/theta.py +0 -37
  342. parsl/tests/integration/test_channels/__init__.py +0 -0
  343. parsl/tests/integration/test_channels/test_channels.py +0 -17
  344. parsl/tests/integration/test_channels/test_local_channel.py +0 -42
  345. parsl/tests/integration/test_channels/test_scp_1.py +0 -45
  346. parsl/tests/integration/test_channels/test_ssh_1.py +0 -40
  347. parsl/tests/integration/test_channels/test_ssh_errors.py +0 -46
  348. parsl/tests/integration/test_channels/test_ssh_file_transport.py +0 -41
  349. parsl/tests/integration/test_channels/test_ssh_interactive.py +0 -24
  350. parsl/tests/manual_tests/test_ad_hoc_htex.py +0 -48
  351. parsl/tests/manual_tests/test_fan_in_out_htex_remote.py +0 -88
  352. parsl/tests/manual_tests/test_oauth_ssh.py +0 -13
  353. parsl/tests/sites/test_local_adhoc.py +0 -61
  354. parsl/tests/test_channels/__init__.py +0 -0
  355. parsl/tests/test_channels/test_large_output.py +0 -22
  356. parsl/tests/test_data/__init__.py +0 -0
  357. parsl/tests/test_mpi_apps/test_mpi_mode_disabled.py +0 -51
  358. parsl/tests/test_providers/test_cobalt_deprecation_warning.py +0 -16
  359. parsl-2024.3.11.dist-info/METADATA +0 -98
  360. parsl-2024.3.11.dist-info/RECORD +0 -447
  361. parsl/{channels/local → monitoring/radios}/__init__.py +0 -0
  362. parsl/{channels/oauth_ssh → tests/test_shutdown}/__init__.py +0 -0
  363. parsl/tests/{test_data → test_staging}/test_file_apps.py +0 -0
  364. parsl/tests/{test_data → test_staging}/test_file_staging.py +0 -0
  365. parsl/{channels/ssh → tests/unit}/__init__.py +0 -0
  366. {parsl-2024.3.11.data → parsl-2025.1.13.data}/scripts/parsl_coprocess.py +1 -1
  367. {parsl-2024.3.11.dist-info → parsl-2025.1.13.dist-info}/LICENSE +0 -0
  368. {parsl-2024.3.11.dist-info → parsl-2025.1.13.dist-info}/entry_points.txt +0 -0
  369. {parsl-2024.3.11.dist-info → parsl-2025.1.13.dist-info}/top_level.txt +0 -0
@@ -1,9 +1,8 @@
1
- import os
2
- import time
3
1
  import logging
4
2
  import math
3
+ import os
4
+ import time
5
5
 
6
- from parsl.channels import LocalChannel
7
6
  from parsl.jobs.states import JobState, JobStatus
8
7
  from parsl.launchers import SingleNodeLauncher
9
8
  from parsl.providers.cluster_provider import ClusterProvider
@@ -32,11 +31,6 @@ class LSFProvider(ClusterProvider, RepresentationMixin):
32
31
 
33
32
  Parameters
34
33
  ----------
35
- channel : Channel
36
- Channel for accessing this provider. Possible channels include
37
- :class:`~parsl.channels.LocalChannel` (the default),
38
- :class:`~parsl.channels.SSHChannel`, or
39
- :class:`~parsl.channels.SSHInteractiveLoginChannel`.
40
34
  nodes_per_block : int
41
35
  Nodes to provision per block.
42
36
  When request_by_nodes is False, it is computed by cores_per_block / cores_per_node.
@@ -71,7 +65,6 @@ class LSFProvider(ClusterProvider, RepresentationMixin):
71
65
  :class:`~parsl.launchers.SingleNodeLauncher` (the default),
72
66
  :class:`~parsl.launchers.SrunLauncher`, or
73
67
  :class:`~parsl.launchers.AprunLauncher`
74
- move_files : Optional[Bool]: should files be moved? by default, Parsl will try to move files.
75
68
  bsub_redirection: Bool
76
69
  Should a redirection symbol "<" be included when submitting jobs, i.e., Bsub < job_script.
77
70
  request_by_nodes: Bool
@@ -81,7 +74,6 @@ class LSFProvider(ClusterProvider, RepresentationMixin):
81
74
  """
82
75
 
83
76
  def __init__(self,
84
- channel=LocalChannel(),
85
77
  nodes_per_block=1,
86
78
  cores_per_block=None,
87
79
  cores_per_node=None,
@@ -95,13 +87,11 @@ class LSFProvider(ClusterProvider, RepresentationMixin):
95
87
  project=None,
96
88
  queue=None,
97
89
  cmd_timeout=120,
98
- move_files=True,
99
90
  bsub_redirection=False,
100
91
  request_by_nodes=True,
101
92
  launcher=SingleNodeLauncher()):
102
93
  label = 'LSF'
103
94
  super().__init__(label,
104
- channel,
105
95
  nodes_per_block,
106
96
  init_blocks,
107
97
  min_blocks,
@@ -115,7 +105,6 @@ class LSFProvider(ClusterProvider, RepresentationMixin):
115
105
  self.queue = queue
116
106
  self.cores_per_block = cores_per_block
117
107
  self.cores_per_node = cores_per_node
118
- self.move_files = move_files
119
108
  self.bsub_redirection = bsub_redirection
120
109
  self.request_by_nodes = request_by_nodes
121
110
 
@@ -217,7 +206,7 @@ class LSFProvider(ClusterProvider, RepresentationMixin):
217
206
  logger.debug("Requesting one block with {} nodes".format(self.nodes_per_block))
218
207
 
219
208
  job_config = {}
220
- job_config["submit_script_dir"] = self.channel.script_dir
209
+ job_config["submit_script_dir"] = self.script_dir
221
210
  job_config["nodes"] = self.nodes_per_block
222
211
  job_config["tasks_per_node"] = tasks_per_node
223
212
  job_config["walltime"] = wtime_to_minutes(self.walltime)
@@ -233,17 +222,10 @@ class LSFProvider(ClusterProvider, RepresentationMixin):
233
222
  logger.debug("Writing submit script")
234
223
  self._write_submit_script(template_string, script_path, job_name, job_config)
235
224
 
236
- if self.move_files:
237
- logger.debug("moving files")
238
- channel_script_path = self.channel.push_file(script_path, self.channel.script_dir)
239
- else:
240
- logger.debug("not moving files")
241
- channel_script_path = script_path
242
-
243
225
  if self.bsub_redirection:
244
- cmd = "bsub < {0}".format(channel_script_path)
226
+ cmd = "bsub < {0}".format(script_path)
245
227
  else:
246
- cmd = "bsub {0}".format(channel_script_path)
228
+ cmd = "bsub {0}".format(script_path)
247
229
  retcode, stdout, stderr = super().execute_wait(cmd)
248
230
 
249
231
  job_id = None
@@ -1,15 +1,12 @@
1
+ import json
1
2
  import logging
2
3
  import os
3
4
  import time
4
- import json
5
5
 
6
- from parsl.channels import LocalChannel
7
6
  from parsl.jobs.states import JobState, JobStatus
8
7
  from parsl.launchers import SingleNodeLauncher
9
8
  from parsl.providers.pbspro.template import template_string
10
- from parsl.providers import TorqueProvider
11
-
12
- from parsl.providers.torque.torque import translate_table
9
+ from parsl.providers.torque.torque import TorqueProvider, translate_table
13
10
 
14
11
  logger = logging.getLogger(__name__)
15
12
 
@@ -19,11 +16,6 @@ class PBSProProvider(TorqueProvider):
19
16
 
20
17
  Parameters
21
18
  ----------
22
- channel : Channel
23
- Channel for accessing this provider. Possible channels include
24
- :class:`~parsl.channels.LocalChannel` (the default),
25
- :class:`~parsl.channels.SSHChannel`, or
26
- :class:`~parsl.channels.SSHInteractiveLoginChannel`.
27
19
  account : str
28
20
  Account the job will be charged against.
29
21
  queue : str
@@ -56,7 +48,6 @@ class PBSProProvider(TorqueProvider):
56
48
  :class:`~parsl.launchers.SingleNodeLauncher`.
57
49
  """
58
50
  def __init__(self,
59
- channel=LocalChannel(),
60
51
  account=None,
61
52
  queue=None,
62
53
  scheduler_options='',
@@ -71,8 +62,7 @@ class PBSProProvider(TorqueProvider):
71
62
  launcher=SingleNodeLauncher(),
72
63
  walltime="00:20:00",
73
64
  cmd_timeout=120):
74
- super().__init__(channel,
75
- account,
65
+ super().__init__(account,
76
66
  queue,
77
67
  scheduler_options,
78
68
  worker_init,
@@ -164,7 +154,7 @@ class PBSProProvider(TorqueProvider):
164
154
  )
165
155
 
166
156
  job_config = {}
167
- job_config["submit_script_dir"] = self.channel.script_dir
157
+ job_config["submit_script_dir"] = self.script_dir
168
158
  job_config["nodes_per_block"] = self.nodes_per_block
169
159
  job_config["ncpus"] = self.cpus_per_node
170
160
  job_config["walltime"] = self.walltime
@@ -188,15 +178,13 @@ class PBSProProvider(TorqueProvider):
188
178
  logger.debug("Writing submit script")
189
179
  self._write_submit_script(self.template_string, script_path, job_name, job_config)
190
180
 
191
- channel_script_path = self.channel.push_file(script_path, self.channel.script_dir)
192
-
193
181
  submit_options = ''
194
182
  if self.queue is not None:
195
183
  submit_options = '{0} -q {1}'.format(submit_options, self.queue)
196
184
  if self.account is not None:
197
185
  submit_options = '{0} -A {1}'.format(submit_options, self.account)
198
186
 
199
- launch_cmd = "qsub {0} {1}".format(submit_options, channel_script_path)
187
+ launch_cmd = "qsub {0} {1}".format(submit_options, script_path)
200
188
  retcode, stdout, stderr = self.execute_wait(launch_cmd)
201
189
 
202
190
  job_id = None
@@ -1,14 +1,12 @@
1
- import os
2
- import math
3
- import time
4
1
  import logging
2
+ import math
3
+ import os
5
4
  import re
6
- import typeguard
5
+ import time
6
+ from typing import Any, Dict, Optional
7
7
 
8
- from typing import Optional
8
+ import typeguard
9
9
 
10
- from parsl.channels import LocalChannel
11
- from parsl.channels.base import Channel
12
10
  from parsl.jobs.states import JobState, JobStatus
13
11
  from parsl.launchers import SingleNodeLauncher
14
12
  from parsl.launchers.base import Launcher
@@ -19,7 +17,25 @@ from parsl.utils import RepresentationMixin, wtime_to_minutes
19
17
 
20
18
  logger = logging.getLogger(__name__)
21
19
 
22
- translate_table = {
20
+ # From https://slurm.schedmd.com/sacct.html#SECTION_JOB-STATE-CODES
21
+ sacct_translate_table = {
22
+ 'PENDING': JobState.PENDING,
23
+ 'RUNNING': JobState.RUNNING,
24
+ 'CANCELLED': JobState.CANCELLED,
25
+ 'COMPLETED': JobState.COMPLETED,
26
+ 'FAILED': JobState.FAILED,
27
+ 'NODE_FAIL': JobState.FAILED,
28
+ 'BOOT_FAIL': JobState.FAILED,
29
+ 'DEADLINE': JobState.TIMEOUT,
30
+ 'TIMEOUT': JobState.TIMEOUT,
31
+ 'REVOKED': JobState.FAILED,
32
+ 'OUT_OF_MEMORY': JobState.FAILED,
33
+ 'SUSPENDED': JobState.HELD,
34
+ 'PREEMPTED': JobState.TIMEOUT,
35
+ 'REQUEUED': JobState.PENDING
36
+ }
37
+
38
+ squeue_translate_table = {
23
39
  'PD': JobState.PENDING,
24
40
  'R': JobState.RUNNING,
25
41
  'CA': JobState.CANCELLED,
@@ -37,7 +53,7 @@ translate_table = {
37
53
  class SlurmProvider(ClusterProvider, RepresentationMixin):
38
54
  """Slurm Execution Provider
39
55
 
40
- This provider uses sbatch to submit, squeue for status and scancel to cancel
56
+ This provider uses sbatch to submit, sacct for status and scancel to cancel
41
57
  jobs. The sbatch script to be used is created from a template file in this
42
58
  same module.
43
59
 
@@ -52,11 +68,9 @@ class SlurmProvider(ClusterProvider, RepresentationMixin):
52
68
  Slurm queue to place job in. If unspecified or ``None``, no queue slurm directive will be specified.
53
69
  constraint : str
54
70
  Slurm job constraint, often used to choose cpu or gpu type. If unspecified or ``None``, no constraint slurm directive will be added.
55
- channel : Channel
56
- Channel for accessing this provider. Possible channels include
57
- :class:`~parsl.channels.LocalChannel` (the default),
58
- :class:`~parsl.channels.SSHChannel`, or
59
- :class:`~parsl.channels.SSHInteractiveLoginChannel`.
71
+ clusters : str
72
+ Slurm cluster name, or comma seperated cluster list, used to choose between different clusters in a federated Slurm instance.
73
+ If unspecified or ``None``, no slurm directive for clusters will be added.
60
74
  nodes_per_block : int
61
75
  Nodes to provision per block.
62
76
  cores_per_node : int
@@ -92,7 +106,6 @@ class SlurmProvider(ClusterProvider, RepresentationMixin):
92
106
  :class:`~parsl.launchers.SingleNodeLauncher` (the default),
93
107
  :class:`~parsl.launchers.SrunLauncher`, or
94
108
  :class:`~parsl.launchers.AprunLauncher`
95
- move_files : Optional[Bool]: should files be moved? by default, Parsl will try to move files.
96
109
  """
97
110
 
98
111
  @typeguard.typechecked
@@ -101,7 +114,7 @@ class SlurmProvider(ClusterProvider, RepresentationMixin):
101
114
  account: Optional[str] = None,
102
115
  qos: Optional[str] = None,
103
116
  constraint: Optional[str] = None,
104
- channel: Channel = LocalChannel(),
117
+ clusters: Optional[str] = None,
105
118
  nodes_per_block: int = 1,
106
119
  cores_per_node: Optional[int] = None,
107
120
  mem_per_node: Optional[int] = None,
@@ -115,11 +128,9 @@ class SlurmProvider(ClusterProvider, RepresentationMixin):
115
128
  worker_init: str = '',
116
129
  cmd_timeout: int = 10,
117
130
  exclusive: bool = True,
118
- move_files: bool = True,
119
131
  launcher: Launcher = SingleNodeLauncher()):
120
132
  label = 'slurm'
121
133
  super().__init__(label,
122
- channel,
123
134
  nodes_per_block,
124
135
  init_blocks,
125
136
  min_blocks,
@@ -133,10 +144,10 @@ class SlurmProvider(ClusterProvider, RepresentationMixin):
133
144
  self.cores_per_node = cores_per_node
134
145
  self.mem_per_node = mem_per_node
135
146
  self.exclusive = exclusive
136
- self.move_files = move_files
137
147
  self.account = account
138
148
  self.qos = qos
139
149
  self.constraint = constraint
150
+ self.clusters = clusters
140
151
  self.scheduler_options = scheduler_options + '\n'
141
152
  if exclusive:
142
153
  self.scheduler_options += "#SBATCH --exclusive\n"
@@ -148,9 +159,36 @@ class SlurmProvider(ClusterProvider, RepresentationMixin):
148
159
  self.scheduler_options += "#SBATCH --qos={}\n".format(qos)
149
160
  if constraint:
150
161
  self.scheduler_options += "#SBATCH --constraint={}\n".format(constraint)
162
+ if clusters:
163
+ self.scheduler_options += "#SBATCH --clusters={}\n".format(clusters)
151
164
 
152
165
  self.regex_job_id = regex_job_id
153
166
  self.worker_init = worker_init + '\n'
167
+ # Check if sacct works and if not fall back to squeue
168
+ cmd = "sacct -X"
169
+ logger.debug("Executing %s", cmd)
170
+ retcode, stdout, stderr = self.execute_wait(cmd)
171
+ # If sacct fails it should return retcode=1 stderr="Slurm accounting storage is disabled"
172
+ logger.debug(f"sacct returned retcode={retcode} stderr={stderr}")
173
+ if retcode == 0:
174
+ logger.debug("using sacct to get job status")
175
+ _cmd = "sacct"
176
+ # Add clusters option to sacct if provided
177
+ if self.clusters:
178
+ _cmd += f" --clusters={self.clusters}"
179
+ # Using state%20 to get enough characters to not truncate output
180
+ # of the state. Without output can look like "<job_id> CANCELLED+"
181
+ self._cmd = _cmd + " -X --noheader --format=jobid,state%20 --job '{0}'"
182
+ self._translate_table = sacct_translate_table
183
+ else:
184
+ logger.debug(f"sacct failed with retcode={retcode}")
185
+ logger.debug("falling back to using squeue to get job status")
186
+ _cmd = "squeue"
187
+ # Add clusters option to squeue if provided
188
+ if self.clusters:
189
+ _cmd += f" --clusters={self.clusters}"
190
+ self._cmd = _cmd + " --noheader --format='%i %t' --job '{0}'"
191
+ self._translate_table = squeue_translate_table
154
192
 
155
193
  def _status(self):
156
194
  '''Returns the status list for a list of job_ids
@@ -168,14 +206,14 @@ class SlurmProvider(ClusterProvider, RepresentationMixin):
168
206
  logger.debug('No active jobs, skipping status update')
169
207
  return
170
208
 
171
- cmd = "squeue --noheader --format='%i %t' --job '{0}'".format(job_id_list)
209
+ cmd = self._cmd.format(job_id_list)
172
210
  logger.debug("Executing %s", cmd)
173
211
  retcode, stdout, stderr = self.execute_wait(cmd)
174
- logger.debug("squeue returned %s %s", stdout, stderr)
212
+ logger.debug("sacct/squeue returned %s %s", stdout, stderr)
175
213
 
176
214
  # Execute_wait failed. Do no update
177
215
  if retcode != 0:
178
- logger.warning("squeue failed with non-zero exit code {}".format(retcode))
216
+ logger.warning("sacct/squeue failed with non-zero exit code {}".format(retcode))
179
217
  return
180
218
 
181
219
  jobs_missing = set(self.resources.keys())
@@ -183,23 +221,27 @@ class SlurmProvider(ClusterProvider, RepresentationMixin):
183
221
  if not line:
184
222
  # Blank line
185
223
  continue
186
- job_id, slurm_state = line.split()
187
- if slurm_state not in translate_table:
224
+ # Sacct includes extra information in some outputs
225
+ # For example "<job_id> CANCELLED by <user_id>"
226
+ # This splits and ignores anything past the first two unpacked values
227
+ job_id, slurm_state, *ignore = line.split()
228
+ if slurm_state not in self._translate_table:
188
229
  logger.warning(f"Slurm status {slurm_state} is not recognized")
189
- status = translate_table.get(slurm_state, JobState.UNKNOWN)
230
+ status = self._translate_table.get(slurm_state, JobState.UNKNOWN)
190
231
  logger.debug("Updating job {} with slurm status {} to parsl state {!s}".format(job_id, slurm_state, status))
191
232
  self.resources[job_id]['status'] = JobStatus(status,
192
233
  stdout_path=self.resources[job_id]['job_stdout_path'],
193
234
  stderr_path=self.resources[job_id]['job_stderr_path'])
194
235
  jobs_missing.remove(job_id)
195
236
 
237
+ # sacct can get job info after jobs have completed so this path shouldn't be hit
196
238
  # squeue does not report on jobs that are not running. So we are filling in the
197
239
  # blanks for missing jobs, we might lose some information about why the jobs failed.
198
240
  for missing_job in jobs_missing:
199
241
  logger.debug("Updating missing job {} to completed status".format(missing_job))
200
- self.resources[missing_job]['status'] = JobStatus(JobState.COMPLETED,
201
- stdout_path=self.resources[missing_job]['job_stdout_path'],
202
- stderr_path=self.resources[missing_job]['job_stderr_path'])
242
+ self.resources[missing_job]['status'] = JobStatus(
243
+ JobState.COMPLETED, stdout_path=self.resources[missing_job]['job_stdout_path'],
244
+ stderr_path=self.resources[missing_job]['job_stderr_path'])
203
245
 
204
246
  def submit(self, command: str, tasks_per_node: int, job_name="parsl.slurm") -> str:
205
247
  """Submit the command as a slurm job.
@@ -238,8 +280,8 @@ class SlurmProvider(ClusterProvider, RepresentationMixin):
238
280
 
239
281
  logger.debug("Requesting one block with {} nodes".format(self.nodes_per_block))
240
282
 
241
- job_config = {}
242
- job_config["submit_script_dir"] = self.channel.script_dir
283
+ job_config: Dict[str, Any] = {}
284
+ job_config["submit_script_dir"] = self.script_dir
243
285
  job_config["nodes"] = self.nodes_per_block
244
286
  job_config["tasks_per_node"] = tasks_per_node
245
287
  job_config["walltime"] = wtime_to_minutes(self.walltime)
@@ -257,14 +299,7 @@ class SlurmProvider(ClusterProvider, RepresentationMixin):
257
299
  logger.debug("Writing submit script")
258
300
  self._write_submit_script(template_string, script_path, job_name, job_config)
259
301
 
260
- if self.move_files:
261
- logger.debug("moving files")
262
- channel_script_path = self.channel.push_file(script_path, self.channel.script_dir)
263
- else:
264
- logger.debug("not moving files")
265
- channel_script_path = script_path
266
-
267
- retcode, stdout, stderr = self.execute_wait("sbatch {0}".format(channel_script_path))
302
+ retcode, stdout, stderr = self.execute_wait("sbatch {0}".format(script_path))
268
303
 
269
304
  if retcode == 0:
270
305
  for line in stdout.split('\n'):
@@ -308,7 +343,14 @@ class SlurmProvider(ClusterProvider, RepresentationMixin):
308
343
  '''
309
344
 
310
345
  job_id_list = ' '.join(job_ids)
311
- retcode, stdout, stderr = self.execute_wait("scancel {0}".format(job_id_list))
346
+
347
+ # Make the command to cancel jobs
348
+ _cmd = "scancel"
349
+ if self.clusters:
350
+ _cmd += f" --clusters={self.clusters}"
351
+ _cmd += " {0}"
352
+
353
+ retcode, stdout, stderr = self.execute_wait(_cmd.format(job_id_list))
312
354
  rets = None
313
355
  if retcode == 0:
314
356
  for jid in job_ids:
@@ -2,11 +2,10 @@ import logging
2
2
  import os
3
3
  import time
4
4
 
5
- from parsl.channels import LocalChannel
6
5
  from parsl.jobs.states import JobState, JobStatus
7
6
  from parsl.launchers import AprunLauncher
8
- from parsl.providers.torque.template import template_string
9
7
  from parsl.providers.cluster_provider import ClusterProvider
8
+ from parsl.providers.torque.template import template_string
10
9
  from parsl.utils import RepresentationMixin
11
10
 
12
11
  logger = logging.getLogger(__name__)
@@ -33,11 +32,6 @@ class TorqueProvider(ClusterProvider, RepresentationMixin):
33
32
 
34
33
  Parameters
35
34
  ----------
36
- channel : Channel
37
- Channel for accessing this provider. Possible channels include
38
- :class:`~parsl.channels.LocalChannel` (the default),
39
- :class:`~parsl.channels.SSHChannel`, or
40
- :class:`~parsl.channels.SSHInteractiveLoginChannel`.
41
35
  account : str
42
36
  Account the job will be charged against.
43
37
  queue : str
@@ -68,7 +62,6 @@ class TorqueProvider(ClusterProvider, RepresentationMixin):
68
62
 
69
63
  """
70
64
  def __init__(self,
71
- channel=LocalChannel(),
72
65
  account=None,
73
66
  queue=None,
74
67
  scheduler_options='',
@@ -83,7 +76,6 @@ class TorqueProvider(ClusterProvider, RepresentationMixin):
83
76
  cmd_timeout=120):
84
77
  label = 'torque'
85
78
  super().__init__(label,
86
- channel,
87
79
  nodes_per_block,
88
80
  init_blocks,
89
81
  min_blocks,
@@ -173,8 +165,7 @@ class TorqueProvider(ClusterProvider, RepresentationMixin):
173
165
  tasks_per_node)
174
166
 
175
167
  job_config = {}
176
- # TODO : script_path might need to change to accommodate script dir set via channels
177
- job_config["submit_script_dir"] = self.channel.script_dir
168
+ job_config["submit_script_dir"] = self.script_dir
178
169
  job_config["nodes"] = self.nodes_per_block
179
170
  job_config["task_blocks"] = self.nodes_per_block * tasks_per_node
180
171
  job_config["nodes_per_block"] = self.nodes_per_block
@@ -192,15 +183,13 @@ class TorqueProvider(ClusterProvider, RepresentationMixin):
192
183
  logger.debug("Writing submit script")
193
184
  self._write_submit_script(self.template_string, script_path, job_name, job_config)
194
185
 
195
- channel_script_path = self.channel.push_file(script_path, self.channel.script_dir)
196
-
197
186
  submit_options = ''
198
187
  if self.queue is not None:
199
188
  submit_options = '{0} -q {1}'.format(submit_options, self.queue)
200
189
  if self.account is not None:
201
190
  submit_options = '{0} -A {1}'.format(submit_options, self.account)
202
191
 
203
- launch_cmd = "qsub {0} {1}".format(submit_options, channel_script_path)
192
+ launch_cmd = "qsub {0} {1}".format(submit_options, script_path)
204
193
  retcode, stdout, stderr = self.execute_wait(launch_cmd)
205
194
 
206
195
  job_id = None
@@ -1,6 +1,11 @@
1
- from parsl.serialize.facade import (serialize, deserialize, pack_apply_message,
2
- unpack_apply_message, unpack_res_spec_apply_message,
3
- pack_res_spec_apply_message)
1
+ from parsl.serialize.facade import (
2
+ deserialize,
3
+ pack_apply_message,
4
+ pack_res_spec_apply_message,
5
+ serialize,
6
+ unpack_apply_message,
7
+ unpack_res_spec_apply_message,
8
+ )
4
9
 
5
10
  __all__ = ['serialize',
6
11
  'deserialize',
parsl/serialize/base.py CHANGED
@@ -1,7 +1,6 @@
1
+ import logging
1
2
  from abc import abstractmethod
2
3
  from functools import cached_property
3
- import logging
4
-
5
4
  from typing import Any
6
5
 
7
6
  logger = logging.getLogger(__name__)
@@ -1,13 +1,14 @@
1
- import dill
2
1
  import functools
3
- import pickle
4
2
  import logging
3
+ import pickle
5
4
 
6
- logger = logging.getLogger(__name__)
7
- from parsl.serialize.base import SerializerBase
5
+ import dill
8
6
 
7
+ logger = logging.getLogger(__name__)
9
8
  from typing import Any
10
9
 
10
+ from parsl.serialize.base import SerializerBase
11
+
11
12
 
12
13
  class PickleSerializer(SerializerBase):
13
14
  """ Pickle serialization covers most python objects, with some notable exceptions:
parsl/serialize/facade.py CHANGED
@@ -87,16 +87,16 @@ def pack_res_spec_apply_message(func: Any, args: Any, kwargs: Any, resource_spec
87
87
  return pack_apply_message(func, args, (kwargs, resource_specification), buffer_threshold=buffer_threshold)
88
88
 
89
89
 
90
- def unpack_apply_message(packed_buffer: bytes, user_ns: Any = None, copy: Any = False) -> List[Any]:
90
+ def unpack_apply_message(packed_buffer: bytes) -> List[Any]:
91
91
  """ Unpack and deserialize function and parameters
92
92
  """
93
93
  return [deserialize(buf) for buf in unpack_buffers(packed_buffer)]
94
94
 
95
95
 
96
- def unpack_res_spec_apply_message(packed_buffer: bytes, user_ns: Any = None, copy: Any = False) -> List[Any]:
96
+ def unpack_res_spec_apply_message(packed_buffer: bytes) -> List[Any]:
97
97
  """ Unpack and deserialize function, parameters, and resource_specification
98
98
  """
99
- func, args, (kwargs, resource_spec) = unpack_apply_message(packed_buffer, user_ns=user_ns, copy=copy)
99
+ func, args, (kwargs, resource_spec) = unpack_apply_message(packed_buffer)
100
100
  return [func, args, kwargs, resource_spec]
101
101
 
102
102
 
@@ -1,10 +1,11 @@
1
- import dill
2
1
  import io
3
2
  import typing as t
4
3
 
5
- from parsl.serialize.base import SerializerBase
4
+ import dill
6
5
  from proxystore.store import Store
7
6
 
7
+ from parsl.serialize.base import SerializerBase
8
+
8
9
 
9
10
  class ProxyStoreDeepPickler(dill.Pickler):
10
11
  """This class extends dill so that certain objects will be stored into
parsl/tests/__init__.py CHANGED
@@ -1,5 +1,5 @@
1
- from parsl.dataflow.memoization import id_for_memo
2
1
  from parsl.data_provider.files import File
2
+ from parsl.dataflow.memoization import id_for_memo
3
3
 
4
4
 
5
5
  @id_for_memo.register(File)
@@ -1,13 +1,12 @@
1
1
  """Config for Azure"""
2
- from parsl.providers import AzureProvider
2
+ import getpass
3
3
 
4
4
  from parsl.config import Config
5
- from parsl.executors import HighThroughputExecutor
6
- from parsl.data_provider.http import HTTPInTaskStaging
7
5
  from parsl.data_provider.ftp import FTPInTaskStaging
6
+ from parsl.data_provider.http import HTTPInTaskStaging
8
7
  from parsl.data_provider.rsync import RSyncStaging
9
-
10
- import getpass
8
+ from parsl.executors import HighThroughputExecutor
9
+ from parsl.providers import AzureProvider
11
10
 
12
11
  # If you are a developer running tests, make sure to update parsl/tests/configs/user_opts.py
13
12
  # If you are a user copying-and-pasting this as an example, make sure to either
@@ -1,7 +1,8 @@
1
1
  from parsl.config import Config
2
- from parsl.providers import SlurmProvider
3
- from parsl.launchers import SrunLauncher
4
2
  from parsl.executors import HighThroughputExecutor
3
+ from parsl.launchers import SrunLauncher
4
+ from parsl.providers import SlurmProvider
5
+
5
6
  from .user_opts import user_opts
6
7
 
7
8
 
@@ -1,7 +1,6 @@
1
1
  from parsl.config import Config
2
- from parsl.channels import LocalChannel
3
- from parsl.providers import GridEngineProvider
4
2
  from parsl.executors import HighThroughputExecutor
3
+ from parsl.providers import GridEngineProvider
5
4
 
6
5
  from .user_opts import user_opts
7
6
 
@@ -14,7 +13,6 @@ def fresh_config():
14
13
  max_workers_per_node=1,
15
14
  encrypted=True,
16
15
  provider=GridEngineProvider(
17
- channel=LocalChannel(),
18
16
  nodes_per_block=2,
19
17
  init_blocks=2,
20
18
  max_blocks=2,
@@ -1,7 +1,8 @@
1
1
  from parsl.config import Config
2
+ from parsl.executors import HighThroughputExecutor
2
3
  from parsl.launchers import SrunLauncher
3
4
  from parsl.providers import SlurmProvider
4
- from parsl.executors import HighThroughputExecutor
5
+
5
6
  from .user_opts import user_opts
6
7
 
7
8
 
@@ -11,10 +11,9 @@ Block {Min:0, init:1, Max:1}
11
11
  ==================
12
12
 
13
13
  """
14
- from parsl.providers import AWSProvider
15
-
16
14
  from parsl.config import Config
17
15
  from parsl.executors import HighThroughputExecutor
16
+ from parsl.providers import AWSProvider
18
17
 
19
18
  # If you are a developer running tests, make sure to update parsl/tests/configs/user_opts.py
20
19
  # If you are a user copying-and-pasting this as an example, make sure to either
@@ -1,7 +1,6 @@
1
- from parsl.providers import AWSProvider
2
-
3
1
  from parsl.config import Config
4
2
  from parsl.executors import HighThroughputExecutor
3
+ from parsl.providers import AWSProvider
5
4
 
6
5
  # If you are a developer running tests, make sure to update parsl/tests/configs/user_opts.py
7
6
  # If you are a user copying-and-pasting this as an example, make sure to either
@@ -0,0 +1,11 @@
1
+ from parsl.config import Config
2
+ from parsl.executors import FluxExecutor
3
+
4
+
5
+ def fresh_config():
6
+ return Config(
7
+ executors=[FluxExecutor()],
8
+ )
9
+
10
+
11
+ config = fresh_config()