parsl 2024.5.20__py3-none-any.whl → 2024.6.3__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 (291) hide show
  1. parsl/__init__.py +9 -10
  2. parsl/addresses.py +6 -4
  3. parsl/app/app.py +3 -6
  4. parsl/app/bash.py +4 -4
  5. parsl/app/errors.py +5 -3
  6. parsl/app/futures.py +3 -3
  7. parsl/app/python.py +2 -1
  8. parsl/benchmark/perf.py +2 -1
  9. parsl/channels/__init__.py +2 -2
  10. parsl/channels/base.py +0 -1
  11. parsl/channels/errors.py +2 -1
  12. parsl/channels/oauth_ssh/oauth_ssh.py +4 -3
  13. parsl/channels/ssh/ssh.py +9 -1
  14. parsl/channels/ssh_il/ssh_il.py +1 -0
  15. parsl/concurrent/__init__.py +2 -2
  16. parsl/config.py +12 -6
  17. parsl/configs/ASPIRE1.py +3 -3
  18. parsl/configs/Azure.py +6 -7
  19. parsl/configs/ad_hoc.py +4 -3
  20. parsl/configs/bridges.py +3 -3
  21. parsl/configs/cc_in2p3.py +2 -2
  22. parsl/configs/ec2.py +1 -1
  23. parsl/configs/expanse.py +1 -2
  24. parsl/configs/frontera.py +2 -3
  25. parsl/configs/htex_local.py +1 -2
  26. parsl/configs/illinoiscluster.py +1 -1
  27. parsl/configs/kubernetes.py +1 -2
  28. parsl/configs/midway.py +3 -3
  29. parsl/configs/osg.py +1 -1
  30. parsl/configs/polaris.py +1 -1
  31. parsl/configs/stampede2.py +4 -5
  32. parsl/configs/summit.py +1 -3
  33. parsl/configs/toss3_llnl.py +1 -2
  34. parsl/configs/vineex_local.py +3 -3
  35. parsl/configs/wqex_local.py +2 -2
  36. parsl/data_provider/data_manager.py +3 -3
  37. parsl/data_provider/file_noop.py +1 -2
  38. parsl/data_provider/files.py +3 -3
  39. parsl/data_provider/ftp.py +1 -3
  40. parsl/data_provider/globus.py +7 -6
  41. parsl/data_provider/http.py +2 -2
  42. parsl/data_provider/rsync.py +1 -1
  43. parsl/data_provider/staging.py +2 -2
  44. parsl/data_provider/zip.py +4 -5
  45. parsl/dataflow/dependency_resolvers.py +115 -0
  46. parsl/dataflow/dflow.py +65 -54
  47. parsl/dataflow/errors.py +2 -1
  48. parsl/dataflow/futures.py +1 -2
  49. parsl/dataflow/memoization.py +5 -5
  50. parsl/dataflow/rundirs.py +1 -1
  51. parsl/dataflow/taskrecord.py +4 -5
  52. parsl/executors/__init__.py +3 -3
  53. parsl/executors/base.py +1 -0
  54. parsl/executors/flux/execute_parsl_task.py +2 -2
  55. parsl/executors/flux/executor.py +11 -12
  56. parsl/executors/flux/flux_instance_manager.py +3 -3
  57. parsl/executors/high_throughput/errors.py +10 -0
  58. parsl/executors/high_throughput/executor.py +31 -36
  59. parsl/executors/high_throughput/interchange.py +16 -18
  60. parsl/executors/high_throughput/manager_record.py +1 -0
  61. parsl/executors/high_throughput/monitoring_info.py +2 -1
  62. parsl/executors/high_throughput/mpi_executor.py +6 -3
  63. parsl/executors/high_throughput/mpi_prefix_composer.py +19 -3
  64. parsl/executors/high_throughput/mpi_resource_management.py +1 -2
  65. parsl/executors/high_throughput/probe.py +6 -4
  66. parsl/executors/high_throughput/process_worker_pool.py +31 -20
  67. parsl/executors/high_throughput/zmq_pipes.py +63 -15
  68. parsl/executors/radical/executor.py +15 -15
  69. parsl/executors/radical/rpex_master.py +1 -2
  70. parsl/executors/radical/rpex_resources.py +4 -9
  71. parsl/executors/radical/rpex_worker.py +2 -1
  72. parsl/executors/status_handling.py +5 -4
  73. parsl/executors/taskvine/__init__.py +1 -1
  74. parsl/executors/taskvine/errors.py +1 -1
  75. parsl/executors/taskvine/exec_parsl_function.py +2 -2
  76. parsl/executors/taskvine/executor.py +23 -24
  77. parsl/executors/taskvine/factory.py +1 -1
  78. parsl/executors/taskvine/manager.py +11 -13
  79. parsl/executors/threads.py +4 -5
  80. parsl/executors/workqueue/errors.py +1 -1
  81. parsl/executors/workqueue/exec_parsl_function.py +5 -4
  82. parsl/executors/workqueue/executor.py +26 -27
  83. parsl/executors/workqueue/parsl_coprocess.py +1 -1
  84. parsl/jobs/error_handlers.py +1 -1
  85. parsl/jobs/job_status_poller.py +2 -5
  86. parsl/jobs/states.py +1 -1
  87. parsl/jobs/strategy.py +2 -2
  88. parsl/launchers/__init__.py +12 -3
  89. parsl/launchers/errors.py +1 -1
  90. parsl/log_utils.py +1 -2
  91. parsl/monitoring/db_manager.py +16 -10
  92. parsl/monitoring/monitoring.py +11 -15
  93. parsl/monitoring/queries/pandas.py +1 -2
  94. parsl/monitoring/radios.py +2 -4
  95. parsl/monitoring/remote.py +13 -8
  96. parsl/monitoring/router.py +8 -11
  97. parsl/monitoring/types.py +2 -0
  98. parsl/monitoring/visualization/app.py +4 -2
  99. parsl/monitoring/visualization/models.py +0 -1
  100. parsl/monitoring/visualization/plots/default/workflow_plots.py +8 -4
  101. parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +1 -0
  102. parsl/monitoring/visualization/utils.py +0 -1
  103. parsl/monitoring/visualization/views.py +16 -9
  104. parsl/multiprocessing.py +0 -1
  105. parsl/process_loggers.py +1 -2
  106. parsl/providers/__init__.py +9 -12
  107. parsl/providers/ad_hoc/ad_hoc.py +1 -1
  108. parsl/providers/aws/aws.py +2 -3
  109. parsl/providers/azure/azure.py +4 -5
  110. parsl/providers/base.py +1 -1
  111. parsl/providers/cluster_provider.py +1 -1
  112. parsl/providers/cobalt/cobalt.py +3 -3
  113. parsl/providers/condor/condor.py +4 -2
  114. parsl/providers/errors.py +2 -2
  115. parsl/providers/googlecloud/googlecloud.py +2 -1
  116. parsl/providers/grid_engine/grid_engine.py +2 -2
  117. parsl/providers/kubernetes/kube.py +5 -3
  118. parsl/providers/local/local.py +5 -1
  119. parsl/providers/lsf/lsf.py +2 -2
  120. parsl/providers/pbspro/pbspro.py +1 -1
  121. parsl/providers/slurm/slurm.py +5 -5
  122. parsl/providers/torque/torque.py +1 -1
  123. parsl/serialize/__init__.py +8 -3
  124. parsl/serialize/base.py +1 -2
  125. parsl/serialize/concretes.py +5 -4
  126. parsl/serialize/proxystore.py +3 -2
  127. parsl/tests/__init__.py +1 -1
  128. parsl/tests/configs/ad_hoc_cluster_htex.py +4 -4
  129. parsl/tests/configs/azure_single_node.py +4 -5
  130. parsl/tests/configs/bridges.py +3 -2
  131. parsl/tests/configs/cc_in2p3.py +2 -2
  132. parsl/tests/configs/comet.py +2 -1
  133. parsl/tests/configs/ec2_single_node.py +1 -2
  134. parsl/tests/configs/ec2_spot.py +1 -2
  135. parsl/tests/configs/frontera.py +3 -2
  136. parsl/tests/configs/htex_ad_hoc_cluster.py +2 -4
  137. parsl/tests/configs/htex_local.py +2 -3
  138. parsl/tests/configs/htex_local_alternate.py +8 -11
  139. parsl/tests/configs/htex_local_intask_staging.py +5 -7
  140. parsl/tests/configs/htex_local_rsync_staging.py +4 -6
  141. parsl/tests/configs/local_adhoc.py +1 -1
  142. parsl/tests/configs/local_radical.py +1 -3
  143. parsl/tests/configs/local_radical_mpi.py +2 -2
  144. parsl/tests/configs/midway.py +2 -2
  145. parsl/tests/configs/nscc_singapore.py +3 -3
  146. parsl/tests/configs/osg_htex.py +1 -1
  147. parsl/tests/configs/petrelkube.py +3 -2
  148. parsl/tests/configs/summit.py +1 -0
  149. parsl/tests/configs/swan_htex.py +2 -2
  150. parsl/tests/configs/taskvine_ex.py +3 -5
  151. parsl/tests/configs/theta.py +2 -2
  152. parsl/tests/configs/workqueue_ex.py +3 -4
  153. parsl/tests/conftest.py +6 -6
  154. parsl/tests/integration/test_channels/test_ssh_errors.py +1 -1
  155. parsl/tests/integration/test_stress/test_python_simple.py +3 -4
  156. parsl/tests/integration/test_stress/test_python_threads.py +3 -5
  157. parsl/tests/manual_tests/htex_local.py +4 -4
  158. parsl/tests/manual_tests/test_ad_hoc_htex.py +2 -1
  159. parsl/tests/manual_tests/test_basic.py +1 -0
  160. parsl/tests/manual_tests/test_fan_in_out_htex_remote.py +4 -4
  161. parsl/tests/manual_tests/test_log_filter.py +3 -1
  162. parsl/tests/manual_tests/test_memory_limits.py +6 -6
  163. parsl/tests/manual_tests/test_regression_220.py +2 -1
  164. parsl/tests/manual_tests/test_udp_simple.py +4 -3
  165. parsl/tests/manual_tests/test_worker_count.py +3 -2
  166. parsl/tests/scaling_tests/htex_local.py +2 -2
  167. parsl/tests/scaling_tests/test_scale.py +0 -9
  168. parsl/tests/scaling_tests/vineex_condor.py +1 -2
  169. parsl/tests/scaling_tests/vineex_local.py +1 -2
  170. parsl/tests/site_tests/test_provider.py +3 -1
  171. parsl/tests/site_tests/test_site.py +2 -0
  172. parsl/tests/sites/test_affinity.py +7 -5
  173. parsl/tests/sites/test_dynamic_executor.py +3 -4
  174. parsl/tests/sites/test_ec2.py +3 -2
  175. parsl/tests/sites/test_local_adhoc.py +2 -1
  176. parsl/tests/sites/test_worker_info.py +4 -3
  177. parsl/tests/test_aalst_patterns.py +0 -1
  178. parsl/tests/test_bash_apps/test_apptimeout.py +2 -2
  179. parsl/tests/test_bash_apps/test_error_codes.py +1 -4
  180. parsl/tests/test_bash_apps/test_memoize_ignore_args.py +1 -0
  181. parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +2 -2
  182. parsl/tests/test_bash_apps/test_pipeline.py +1 -1
  183. parsl/tests/test_bash_apps/test_std_uri.py +4 -9
  184. parsl/tests/test_callables.py +2 -2
  185. parsl/tests/test_checkpointing/test_periodic.py +2 -7
  186. parsl/tests/test_checkpointing/test_python_checkpoint_1.py +1 -0
  187. parsl/tests/test_checkpointing/test_python_checkpoint_2.py +2 -2
  188. parsl/tests/test_checkpointing/test_python_checkpoint_3.py +0 -1
  189. parsl/tests/test_checkpointing/test_regression_239.py +1 -1
  190. parsl/tests/test_checkpointing/test_task_exit.py +1 -2
  191. parsl/tests/test_docs/test_from_slides.py +2 -2
  192. parsl/tests/test_docs/test_kwargs.py +1 -1
  193. parsl/tests/test_docs/test_tutorial_1.py +1 -2
  194. parsl/tests/test_docs/test_workflow1.py +2 -2
  195. parsl/tests/test_docs/test_workflow2.py +0 -1
  196. parsl/tests/test_error_handling/test_rand_fail.py +2 -2
  197. parsl/tests/test_error_handling/test_resource_spec.py +4 -2
  198. parsl/tests/test_error_handling/test_retries.py +2 -1
  199. parsl/tests/test_error_handling/test_retry_handler.py +1 -0
  200. parsl/tests/test_error_handling/test_retry_handler_failure.py +2 -1
  201. parsl/tests/test_error_handling/test_serialization_fail.py +1 -1
  202. parsl/tests/test_error_handling/test_wrap_with_logs.py +1 -0
  203. parsl/tests/test_flux.py +1 -1
  204. parsl/tests/test_htex/test_basic.py +0 -1
  205. parsl/tests/test_htex/test_command_client_timeout.py +66 -0
  206. parsl/tests/test_htex/test_connected_blocks.py +3 -2
  207. parsl/tests/test_htex/test_cpu_affinity_explicit.py +6 -10
  208. parsl/tests/test_htex/test_disconnected_blocks.py +6 -4
  209. parsl/tests/test_htex/test_drain.py +5 -5
  210. parsl/tests/test_htex/test_htex.py +1 -2
  211. parsl/tests/test_htex/test_manager_failure.py +0 -1
  212. parsl/tests/test_htex/test_managers_command.py +5 -9
  213. parsl/tests/test_htex/test_missing_worker.py +2 -8
  214. parsl/tests/test_htex/test_multiple_disconnected_blocks.py +6 -4
  215. parsl/tests/test_monitoring/test_app_names.py +3 -3
  216. parsl/tests/test_monitoring/test_basic.py +4 -6
  217. parsl/tests/test_monitoring/test_db_locks.py +6 -4
  218. parsl/tests/test_monitoring/test_fuzz_zmq.py +6 -4
  219. parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +5 -7
  220. parsl/tests/test_monitoring/test_incomplete_futures.py +5 -4
  221. parsl/tests/test_monitoring/test_memoization_representation.py +4 -2
  222. parsl/tests/test_monitoring/test_stdouterr.py +4 -6
  223. parsl/tests/test_monitoring/test_viz_colouring.py +1 -0
  224. parsl/tests/test_mpi_apps/test_bad_mpi_config.py +1 -1
  225. parsl/tests/test_mpi_apps/test_mpi_mode_disabled.py +4 -7
  226. parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +15 -4
  227. parsl/tests/test_mpi_apps/test_mpi_prefix.py +4 -4
  228. parsl/tests/test_mpi_apps/test_mpi_scheduler.py +7 -2
  229. parsl/tests/test_mpi_apps/test_mpiex.py +4 -3
  230. parsl/tests/test_mpi_apps/test_resource_spec.py +21 -17
  231. parsl/tests/test_providers/test_cobalt_deprecation_warning.py +2 -0
  232. parsl/tests/test_providers/test_local_provider.py +2 -1
  233. parsl/tests/test_providers/test_pbspro_template.py +1 -1
  234. parsl/tests/test_providers/test_slurm_template.py +1 -1
  235. parsl/tests/test_providers/test_submiterror_deprecation.py +2 -1
  236. parsl/tests/test_python_apps/test_context_manager.py +5 -12
  237. parsl/tests/test_python_apps/test_dep_standard_futures.py +2 -1
  238. parsl/tests/test_python_apps/test_futures.py +2 -1
  239. parsl/tests/test_python_apps/test_join.py +0 -1
  240. parsl/tests/test_python_apps/test_lifted.py +11 -7
  241. parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +1 -0
  242. parsl/tests/test_python_apps/test_pluggable_future_resolution.py +161 -0
  243. parsl/tests/test_radical/test_mpi_funcs.py +1 -1
  244. parsl/tests/test_regression/test_1480.py +2 -1
  245. parsl/tests/test_regression/test_1653.py +2 -1
  246. parsl/tests/test_regression/test_2652.py +1 -0
  247. parsl/tests/test_regression/test_69a.py +0 -1
  248. parsl/tests/test_regression/test_854.py +4 -2
  249. parsl/tests/test_regression/test_97_parallelism_0.py +1 -2
  250. parsl/tests/test_regression/test_98.py +0 -1
  251. parsl/tests/test_scaling/test_block_error_handler.py +9 -4
  252. parsl/tests/test_scaling/test_regression_1621.py +0 -2
  253. parsl/tests/test_scaling/test_scale_down.py +2 -3
  254. parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +4 -5
  255. parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +3 -4
  256. parsl/tests/test_scaling/test_shutdown_scalein.py +1 -4
  257. parsl/tests/test_serialization/test_2555_caching_deserializer.py +1 -1
  258. parsl/tests/test_serialization/test_basic.py +2 -1
  259. parsl/tests/test_serialization/test_htex_code_cache.py +3 -4
  260. parsl/tests/test_serialization/test_pack_resource_spec.py +2 -1
  261. parsl/tests/test_serialization/test_proxystore_configured.py +10 -6
  262. parsl/tests/test_serialization/test_proxystore_impl.py +5 -3
  263. parsl/tests/test_shutdown/test_kill_monitoring.py +3 -4
  264. parsl/tests/test_staging/staging_provider.py +2 -2
  265. parsl/tests/test_staging/test_1316.py +3 -4
  266. parsl/tests/test_staging/test_docs_1.py +1 -1
  267. parsl/tests/test_staging/test_docs_2.py +2 -1
  268. parsl/tests/test_staging/test_elaborate_noop_file.py +2 -3
  269. parsl/tests/test_staging/test_staging_https.py +2 -2
  270. parsl/tests/test_staging/test_staging_stdout.py +4 -3
  271. parsl/tests/test_staging/test_zip_in.py +6 -8
  272. parsl/tests/test_staging/test_zip_out.py +7 -9
  273. parsl/tests/test_staging/test_zip_to_zip.py +6 -8
  274. parsl/tests/test_summary.py +2 -2
  275. parsl/tests/test_thread_parallelism.py +0 -1
  276. parsl/tests/test_threads/test_configs.py +1 -2
  277. parsl/tests/test_threads/test_lazy_errors.py +2 -2
  278. parsl/usage_tracking/api.py +2 -3
  279. parsl/usage_tracking/usage.py +8 -18
  280. parsl/utils.py +13 -2
  281. parsl/version.py +1 -1
  282. {parsl-2024.5.20.data → parsl-2024.6.3.data}/scripts/exec_parsl_function.py +5 -4
  283. {parsl-2024.5.20.data → parsl-2024.6.3.data}/scripts/process_worker_pool.py +31 -20
  284. {parsl-2024.5.20.dist-info → parsl-2024.6.3.dist-info}/METADATA +6 -6
  285. parsl-2024.6.3.dist-info/RECORD +471 -0
  286. parsl-2024.5.20.dist-info/RECORD +0 -468
  287. {parsl-2024.5.20.data → parsl-2024.6.3.data}/scripts/parsl_coprocess.py +1 -1
  288. {parsl-2024.5.20.dist-info → parsl-2024.6.3.dist-info}/LICENSE +0 -0
  289. {parsl-2024.5.20.dist-info → parsl-2024.6.3.dist-info}/WHEEL +0 -0
  290. {parsl-2024.5.20.dist-info → parsl-2024.6.3.dist-info}/entry_points.txt +0 -0
  291. {parsl-2024.5.20.dist-info → parsl-2024.6.3.dist-info}/top_level.txt +0 -0
@@ -1,15 +1,14 @@
1
+ from threading import Event
2
+
1
3
  import pytest
2
4
 
3
5
  import parsl
4
-
5
6
  from parsl import File, python_app
6
- from parsl.providers import LocalProvider
7
7
  from parsl.channels import LocalChannel
8
- from parsl.launchers import SingleNodeLauncher
9
8
  from parsl.config import Config
10
9
  from parsl.executors import HighThroughputExecutor
11
-
12
- from threading import Event
10
+ from parsl.launchers import SingleNodeLauncher
11
+ from parsl.providers import LocalProvider
13
12
 
14
13
  _max_blocks = 5
15
14
  _min_blocks = 0
@@ -4,14 +4,13 @@ import time
4
4
  import pytest
5
5
 
6
6
  import parsl
7
-
8
7
  from parsl import File, python_app
9
- from parsl.jobs.states import JobState, TERMINAL_STATES
10
- from parsl.providers import LocalProvider
11
8
  from parsl.channels import LocalChannel
12
- from parsl.launchers import SingleNodeLauncher
13
9
  from parsl.config import Config
14
10
  from parsl.executors import HighThroughputExecutor
11
+ from parsl.jobs.states import TERMINAL_STATES, JobState
12
+ from parsl.launchers import SingleNodeLauncher
13
+ from parsl.providers import LocalProvider
15
14
 
16
15
  logger = logging.getLogger(__name__)
17
16
 
@@ -1,3 +1,4 @@
1
+ import random
1
2
  import threading
2
3
 
3
4
  import pytest
@@ -9,8 +10,6 @@ from parsl.executors import HighThroughputExecutor
9
10
  from parsl.launchers import SimpleLauncher
10
11
  from parsl.providers import LocalProvider
11
12
 
12
- import random
13
-
14
13
  # we need some blocks, but it doesn't matter too much how many, as long
15
14
  # as they can all start up and get registered within the try_assert
16
15
  # timeout later on.
@@ -72,7 +71,5 @@ def test_shutdown_scalein_blocks(tmpd_cwd, try_assert):
72
71
  # this will wait for everything to be scaled out fully
73
72
  try_assert(lambda: len(htex.connected_managers()) == BLOCK_COUNT)
74
73
 
75
- parsl.clear()
76
-
77
74
  assert len(accumulating_provider.submit_job_ids) == BLOCK_COUNT, f"Exactly {BLOCK_COUNT} blocks should have been launched"
78
75
  assert len(accumulating_provider.cancel_job_ids) == BLOCK_COUNT, f"Exactly {BLOCK_COUNT} blocks should have been scaled in"
@@ -1,6 +1,6 @@
1
- import parsl
2
1
  import pytest
3
2
 
3
+ import parsl
4
4
  from parsl.tests.configs.htex_local import fresh_config as local_config
5
5
 
6
6
 
@@ -1,5 +1,6 @@
1
1
  import pytest
2
- from parsl.serialize import serialize, deserialize
2
+
3
+ from parsl.serialize import deserialize, serialize
3
4
  from parsl.serialize.concretes import DillSerializer, PickleSerializer
4
5
 
5
6
 
@@ -1,10 +1,9 @@
1
- import parsl
2
- import pytest
3
-
4
1
  from typing import Any
5
2
 
6
- from parsl.serialize.facade import methods_for_code
3
+ import pytest
7
4
 
5
+ import parsl
6
+ from parsl.serialize.facade import methods_for_code
8
7
  from parsl.tests.configs.htex_local import fresh_config as local_config
9
8
 
10
9
 
@@ -1,5 +1,6 @@
1
1
  import pytest
2
- from parsl.serialize import unpack_res_spec_apply_message, pack_res_spec_apply_message
2
+
3
+ from parsl.serialize import pack_res_spec_apply_message, unpack_res_spec_apply_message
3
4
 
4
5
 
5
6
  def double(x: int, y: int = 2) -> int:
@@ -1,19 +1,24 @@
1
1
  import logging
2
- import pytest
3
2
  import uuid
4
3
 
4
+ import pytest
5
+
5
6
  import parsl
6
- from parsl.serialize.facade import additional_methods_for_deserialization, methods_for_data, register_method_for_data
7
+ from parsl.serialize.facade import (
8
+ additional_methods_for_deserialization,
9
+ methods_for_data,
10
+ register_method_for_data,
11
+ )
7
12
  from parsl.tests.configs.htex_local import fresh_config
8
13
 
9
-
10
14
  logger = logging.getLogger(__name__)
11
15
 
12
16
 
13
17
  def local_setup():
14
- from parsl.serialize.proxystore import ProxyStoreSerializer
15
- from proxystore.store import Store, register_store
16
18
  from proxystore.connectors.file import FileConnector
19
+ from proxystore.store import Store, register_store
20
+
21
+ from parsl.serialize.proxystore import ProxyStoreSerializer
17
22
 
18
23
  parsl.load(fresh_config())
19
24
 
@@ -38,7 +43,6 @@ def local_setup():
38
43
 
39
44
  def local_teardown():
40
45
  parsl.dfk().cleanup()
41
- parsl.clear()
42
46
 
43
47
  methods_for_data.clear()
44
48
  methods_for_data.update(previous_methods)
@@ -1,6 +1,7 @@
1
- import pytest
2
1
  import uuid
3
2
 
3
+ import pytest
4
+
4
5
 
5
6
  def policy_example(o):
6
7
  """Example policy will proxy only lists."""
@@ -13,10 +14,11 @@ def test_proxystore_nonglobal():
13
14
  """
14
15
  # import in function, because proxystore is not importable in base parsl
15
16
  # installation.
16
- from parsl.serialize.proxystore import ProxyStoreSerializer
17
+ from proxystore.connectors.file import FileConnector
17
18
  from proxystore.proxy import Proxy
18
19
  from proxystore.store import Store, register_store
19
- from proxystore.connectors.file import FileConnector
20
+
21
+ from parsl.serialize.proxystore import ProxyStoreSerializer
20
22
 
21
23
  store = Store(name='parsl_store_' + str(uuid.uuid4()), connector=FileConnector(store_dir="/tmp"))
22
24
  register_store(store)
@@ -1,9 +1,10 @@
1
1
  import os
2
- import parsl
3
- import pytest
4
2
  import signal
5
3
  import time
6
4
 
5
+ import pytest
6
+
7
+ import parsl
7
8
  from parsl.tests.configs.htex_local_alternate import fresh_config
8
9
 
9
10
  # This is a very generous upper bound on expected shutdown time of target
@@ -25,7 +26,6 @@ def test_no_kills():
25
26
  assert parsl.dfk().monitoring is not None, "This test requires monitoring"
26
27
 
27
28
  parsl.dfk().cleanup()
28
- parsl.clear()
29
29
 
30
30
 
31
31
  @pytest.mark.local
@@ -62,4 +62,3 @@ def test_kill_monitoring_helper_process(sig, process_attr, try_assert):
62
62
  simple_app().result()
63
63
 
64
64
  parsl.dfk().cleanup()
65
- parsl.clear()
@@ -62,8 +62,8 @@ def make_stage_out_app(executor, dfk):
62
62
 
63
63
 
64
64
  def stage_out_noop(app_fu, inputs=[], _parsl_staging_inhibit=True):
65
- import time
66
65
  import logging
66
+ import time
67
67
  logger = logging.getLogger(__name__)
68
68
  logger.info("stage_out_noop")
69
69
  time.sleep(1)
@@ -75,8 +75,8 @@ def make_stage_in_app(executor, dfk):
75
75
 
76
76
 
77
77
  def stage_in_noop(parent_fut=None, outputs=[], _parsl_staging_inhibit=True):
78
- import time
79
78
  import logging
79
+ import time
80
80
  logger = logging.getLogger(__name__)
81
81
  logger.info("stage_in_noop")
82
82
  time.sleep(1)
@@ -1,8 +1,9 @@
1
+ import time
2
+
1
3
  import pytest
2
4
 
3
5
  import parsl
4
- import time
5
- from parsl import python_app, ThreadPoolExecutor
6
+ from parsl import ThreadPoolExecutor, python_app
6
7
  from parsl.config import Config
7
8
  from parsl.data_provider.files import File
8
9
  from parsl.data_provider.staging import Staging
@@ -60,7 +61,6 @@ def test_1316_local_path_on_execution_side_sp2():
60
61
  assert not file.local_path, "The local_path on the submit side should not be set"
61
62
 
62
63
  parsl.dfk().cleanup()
63
- parsl.clear()
64
64
 
65
65
 
66
66
  @pytest.mark.local
@@ -83,4 +83,3 @@ def test_1316_local_path_setting_preserves_dependency_sp2():
83
83
  assert not file.local_path, "The local_path on the submit side should not be set"
84
84
 
85
85
  parsl.dfk().cleanup()
86
- parsl.clear()
@@ -1,6 +1,6 @@
1
1
  import pytest
2
2
 
3
- from parsl import python_app, File
3
+ from parsl import File, python_app
4
4
 
5
5
 
6
6
  @python_app
@@ -1,5 +1,6 @@
1
1
  import pytest
2
- from parsl import bash_app, File
2
+
3
+ from parsl import File, bash_app
3
4
  from parsl.tests.configs.local_threads import fresh_config as local_config
4
5
 
5
6
 
@@ -6,15 +6,15 @@
6
6
  # of the globus staging provider
7
7
 
8
8
  import logging
9
+
9
10
  import pytest
10
11
 
11
12
  import parsl
12
-
13
13
  from parsl import bash_app, python_app
14
14
  from parsl.config import Config
15
15
  from parsl.data_provider.files import File
16
16
  from parsl.executors.threads import ThreadPoolExecutor
17
- from parsl.tests.test_staging.staging_provider import NoOpTestingFileStaging, NoOpError
17
+ from parsl.tests.test_staging.staging_provider import NoOpError, NoOpTestingFileStaging
18
18
 
19
19
  logger = logging.getLogger(__name__)
20
20
 
@@ -44,7 +44,6 @@ def storage_access_parsl():
44
44
  yield _setup_config
45
45
 
46
46
  parsl.dfk().cleanup()
47
- parsl.clear()
48
47
 
49
48
 
50
49
  @pytest.mark.local
@@ -1,9 +1,9 @@
1
+ import pytest
2
+
1
3
  import parsl
2
4
  from parsl.app.app import python_app
3
5
  from parsl.data_provider.files import File
4
6
 
5
- import pytest
6
-
7
7
  # This config is for the local test which will adding an executor.
8
8
  # Most tests in this file should be non-local and use the configuration
9
9
  # specificed with --config, not this one.
@@ -1,12 +1,13 @@
1
1
  import logging
2
2
  import os
3
- import parsl
4
- import pytest
5
3
  import zipfile
6
4
 
5
+ import pytest
6
+
7
+ import parsl
7
8
  from parsl.app.futures import DataFuture
8
- from parsl.tests.configs.htex_local import fresh_config as local_config
9
9
  from parsl.data_provider.files import File
10
+ from parsl.tests.configs.htex_local import fresh_config as local_config
10
11
 
11
12
 
12
13
  @parsl.bash_app
@@ -1,18 +1,16 @@
1
- import parsl
2
- import pytest
3
1
  import random
4
2
  import zipfile
5
3
 
6
- from parsl.data_provider.files import File
7
- from parsl.data_provider.zip import ZipAuthorityError, ZipFileStaging
4
+ import pytest
8
5
 
9
- from parsl.providers import LocalProvider
6
+ import parsl
10
7
  from parsl.channels import LocalChannel
11
- from parsl.launchers import SimpleLauncher
12
-
13
8
  from parsl.config import Config
9
+ from parsl.data_provider.files import File
10
+ from parsl.data_provider.zip import ZipAuthorityError, ZipFileStaging
14
11
  from parsl.executors import HighThroughputExecutor
15
-
12
+ from parsl.launchers import SimpleLauncher
13
+ from parsl.providers import LocalProvider
16
14
  from parsl.tests.configs.htex_local import fresh_config as local_config
17
15
 
18
16
 
@@ -1,18 +1,16 @@
1
- import parsl
2
- import pytest
3
1
  import zipfile
4
2
 
5
- from parsl.data_provider.files import File
6
- from parsl.data_provider.data_manager import default_staging
7
- from parsl.data_provider.zip import ZipAuthorityError, ZipFileStaging
3
+ import pytest
8
4
 
9
- from parsl.providers import LocalProvider
5
+ import parsl
10
6
  from parsl.channels import LocalChannel
11
- from parsl.launchers import SimpleLauncher
12
-
13
7
  from parsl.config import Config
8
+ from parsl.data_provider.data_manager import default_staging
9
+ from parsl.data_provider.files import File
10
+ from parsl.data_provider.zip import ZipAuthorityError, ZipFileStaging
14
11
  from parsl.executors import HighThroughputExecutor
15
-
12
+ from parsl.launchers import SimpleLauncher
13
+ from parsl.providers import LocalProvider
16
14
  from parsl.tests.configs.htex_local import fresh_config as local_config
17
15
 
18
16
 
@@ -1,18 +1,16 @@
1
- import parsl
2
- import pytest
3
1
  import random
4
2
  import zipfile
5
3
 
6
- from parsl.data_provider.files import File
7
- from parsl.data_provider.zip import ZipAuthorityError, ZipFileStaging
4
+ import pytest
8
5
 
9
- from parsl.providers import LocalProvider
6
+ import parsl
10
7
  from parsl.channels import LocalChannel
11
- from parsl.launchers import SimpleLauncher
12
-
13
8
  from parsl.config import Config
9
+ from parsl.data_provider.files import File
10
+ from parsl.data_provider.zip import ZipAuthorityError, ZipFileStaging
14
11
  from parsl.executors import HighThroughputExecutor
15
-
12
+ from parsl.launchers import SimpleLauncher
13
+ from parsl.providers import LocalProvider
16
14
  from parsl.tests.configs.htex_local import fresh_config as local_config
17
15
 
18
16
 
@@ -1,5 +1,6 @@
1
- import parsl
2
1
  import pytest
2
+
3
+ import parsl
3
4
  from parsl.tests.configs.local_threads import fresh_config
4
5
 
5
6
 
@@ -22,7 +23,6 @@ def test_summary(caplog):
22
23
  fail().exception()
23
24
 
24
25
  parsl.dfk().cleanup()
25
- parsl.clear()
26
26
 
27
27
  assert "Summary of tasks in DFK:" in caplog.text
28
28
  assert "Tasks in state States.exec_done: 1" in caplog.text
@@ -5,7 +5,6 @@ import pytest
5
5
  from parsl.app.app import bash_app, python_app
6
6
  from parsl.tests.configs.local_threads import config
7
7
 
8
-
9
8
  local_config = config
10
9
 
11
10
 
@@ -7,9 +7,9 @@ from parsl.tests.configs.local_threads import fresh_config
7
7
 
8
8
  @python_app
9
9
  def worker_identify(x, sleep_dur=0.2):
10
- import time
11
10
  import os
12
11
  import threading
12
+ import time
13
13
  time.sleep(sleep_dur)
14
14
  return {"pid": os.getpid(),
15
15
  "tid": threading.current_thread()}
@@ -30,5 +30,4 @@ def test_parallel_for():
30
30
  assert thread_count <= config.executors[0].max_threads, "More threads than allowed"
31
31
  assert process_count == 1, "More processes than allowed"
32
32
  dfk.cleanup()
33
- parsl.clear()
34
33
  return d
@@ -1,5 +1,6 @@
1
- import parsl
2
1
  import pytest
2
+
3
+ import parsl
3
4
  from parsl import python_app
4
5
  from parsl.tests.configs.local_threads import fresh_config
5
6
 
@@ -24,5 +25,4 @@ def test_lazy_behavior():
24
25
  assert f.done()
25
26
 
26
27
  parsl.dfk().cleanup()
27
- parsl.clear()
28
28
  return
@@ -1,11 +1,9 @@
1
1
  import inspect
2
-
3
- from parsl.utils import RepresentationMixin
4
-
5
2
  from abc import abstractmethod
6
3
  from functools import singledispatch
7
4
  from typing import Any, List, Sequence
8
5
 
6
+ from parsl.utils import RepresentationMixin
9
7
 
10
8
  # Traverse the configuration hierarchy, returning a JSON component
11
9
  # for each one. Configuration components which implement
@@ -14,6 +12,7 @@ from typing import Any, List, Sequence
14
12
  # are traversed in sequence. Other types default to reporting no
15
13
  # usage information.
16
14
 
15
+
17
16
  @singledispatch
18
17
  def get_parsl_usage(obj) -> List[Any]:
19
18
  return []
@@ -1,21 +1,21 @@
1
- import uuid
2
- import time
3
- import os
4
1
  import json
5
2
  import logging
3
+ import platform
6
4
  import socket
7
5
  import sys
8
- import platform
6
+ import time
7
+ import uuid
9
8
 
9
+ from parsl.dataflow.states import States
10
+ from parsl.multiprocessing import ForkProcess
10
11
  from parsl.usage_tracking.api import get_parsl_usage
11
12
  from parsl.utils import setproctitle
12
- from parsl.multiprocessing import ForkProcess
13
- from parsl.dataflow.states import States
14
13
  from parsl.version import VERSION as PARSL_VERSION
15
14
 
16
15
  logger = logging.getLogger(__name__)
17
16
 
18
17
  from typing import Callable
18
+
19
19
  from typing_extensions import ParamSpec
20
20
 
21
21
  # protocol version byte: when (for example) compression parameters are changed
@@ -116,22 +116,12 @@ class UsageTracker:
116
116
  def check_tracking_enabled(self):
117
117
  """Check if tracking is enabled.
118
118
 
119
- Tracking will be enabled unless either of these is true:
119
+ Tracking will be enabled unless the following is true:
120
120
 
121
121
  1. dfk.config.usage_tracking is set to False
122
- 2. Environment variable PARSL_TRACKING is set to false (case insensitive)
123
122
 
124
123
  """
125
- track = True
126
-
127
- if not self.config.usage_tracking:
128
- track = False
129
-
130
- envvar = str(os.environ.get("PARSL_TRACKING", True)).lower()
131
- if envvar == "false":
132
- track = False
133
-
134
- return track
124
+ return self.config.usage_tracking
135
125
 
136
126
  def construct_start_message(self) -> bytes:
137
127
  """Collect preliminary run info at the start of the DFK.
parsl/utils.py CHANGED
@@ -7,7 +7,19 @@ import threading
7
7
  import time
8
8
  from contextlib import contextmanager
9
9
  from types import TracebackType
10
- from typing import Any, Callable, List, Sequence, Tuple, Union, Generator, IO, AnyStr, Dict, Optional
10
+ from typing import (
11
+ IO,
12
+ Any,
13
+ AnyStr,
14
+ Callable,
15
+ Dict,
16
+ Generator,
17
+ List,
18
+ Optional,
19
+ Sequence,
20
+ Tuple,
21
+ Union,
22
+ )
11
23
 
12
24
  import typeguard
13
25
  from typing_extensions import Type
@@ -16,7 +28,6 @@ import parsl
16
28
  from parsl.app.errors import BadStdStreamFile
17
29
  from parsl.version import VERSION
18
30
 
19
-
20
31
  try:
21
32
  import setproctitle as setproctitle_module
22
33
  except ImportError:
parsl/version.py CHANGED
@@ -3,4 +3,4 @@
3
3
  Year.Month.Day[alpha/beta/..]
4
4
  Alphas will be numbered like this -> 2024.12.10a0
5
5
  """
6
- VERSION = '2024.05.20'
6
+ VERSION = '2024.06.03'
@@ -1,10 +1,11 @@
1
+ import pickle
2
+ import sys
3
+ import traceback
4
+
1
5
  from parsl.app.errors import RemoteExceptionWrapper
2
6
  from parsl.data_provider.files import File
3
- from parsl.utils import get_std_fname_mode
4
- import traceback
5
- import sys
6
- import pickle
7
7
  from parsl.serialize import serialize
8
+ from parsl.utils import get_std_fname_mode
8
9
 
9
10
  # This scripts executes a parsl function which is pickled in a file:
10
11
  #
@@ -1,39 +1,41 @@
1
1
  #!python
2
2
 
3
3
  import argparse
4
+ import json
4
5
  import logging
6
+ import math
7
+ import multiprocessing
5
8
  import os
6
- import sys
9
+ import pickle
7
10
  import platform
11
+ import queue
12
+ import sys
8
13
  import threading
9
- import pickle
10
14
  import time
11
- import queue
12
15
  import uuid
13
- from typing import Sequence, Optional, Dict, List
14
-
15
- import zmq
16
- import math
17
- import json
18
- import psutil
19
- import multiprocessing
20
16
  from multiprocessing.managers import DictProxy
21
17
  from multiprocessing.sharedctypes import Synchronized
18
+ from typing import Dict, List, Optional, Sequence
19
+
20
+ import psutil
21
+ import zmq
22
22
 
23
23
  from parsl import curvezmq
24
- from parsl.process_loggers import wrap_with_logs
25
- from parsl.version import VERSION as PARSL_VERSION
26
24
  from parsl.app.errors import RemoteExceptionWrapper
27
25
  from parsl.executors.high_throughput.errors import WorkerLost
28
- from parsl.executors.high_throughput.probe import probe_addresses
29
- from parsl.multiprocessing import SpawnContext
30
- from parsl.serialize import unpack_res_spec_apply_message, serialize
26
+ from parsl.executors.high_throughput.mpi_prefix_composer import (
27
+ VALID_LAUNCHERS,
28
+ compose_all,
29
+ )
31
30
  from parsl.executors.high_throughput.mpi_resource_management import (
31
+ MPITaskScheduler,
32
32
  TaskScheduler,
33
- MPITaskScheduler
34
33
  )
35
-
36
- from parsl.executors.high_throughput.mpi_prefix_composer import compose_all, VALID_LAUNCHERS
34
+ from parsl.executors.high_throughput.probe import probe_addresses
35
+ from parsl.multiprocessing import SpawnContext
36
+ from parsl.process_loggers import wrap_with_logs
37
+ from parsl.serialize import serialize, unpack_res_spec_apply_message
38
+ from parsl.version import VERSION as PARSL_VERSION
37
39
 
38
40
  HEARTBEAT_CODE = (2 ** 32) - 1
39
41
  DRAINED_CODE = (2 ** 32) - 2
@@ -677,7 +679,8 @@ def worker(
677
679
  # If desired, set process affinity
678
680
  if cpu_affinity != "none":
679
681
  # Count the number of cores per worker
680
- avail_cores = sorted(os.sched_getaffinity(0)) # Get the available threads
682
+ # OSX does not implement os.sched_getaffinity
683
+ avail_cores = sorted(os.sched_getaffinity(0)) # type: ignore[attr-defined, unused-ignore]
681
684
  cores_per_worker = len(avail_cores) // pool_size
682
685
  assert cores_per_worker > 0, "Affinity does not work if there are more workers than cores"
683
686
 
@@ -717,7 +720,15 @@ def worker(
717
720
  os.environ["KMP_AFFINITY"] = f"explicit,proclist=[{proc_list}]" # For Intel OpenMP
718
721
 
719
722
  # Set the affinity for this worker
720
- os.sched_setaffinity(0, my_cores)
723
+ # OSX does not implement os.sched_setaffinity so type checking
724
+ # is ignored here in two ways:
725
+ # On a platform without sched_setaffinity, that attribute will not
726
+ # be defined, so ignore[attr-defined] will tell mypy to ignore this
727
+ # incorrect-for-OS X attribute access.
728
+ # On a platform with sched_setaffinity, that type: ignore message
729
+ # will be redundant, and ignore[unused-ignore] tells mypy to ignore
730
+ # that this ignore is unneeded.
731
+ os.sched_setaffinity(0, my_cores) # type: ignore[attr-defined, unused-ignore]
721
732
  logger.info("Set worker CPU affinity to {}".format(my_cores))
722
733
 
723
734
  # If desired, pin to accelerator