parsl 2024.5.27__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 (283) 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 +5 -5
  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/dflow.py +21 -16
  46. parsl/dataflow/errors.py +2 -1
  47. parsl/dataflow/futures.py +1 -2
  48. parsl/dataflow/memoization.py +5 -5
  49. parsl/dataflow/rundirs.py +1 -1
  50. parsl/dataflow/taskrecord.py +4 -5
  51. parsl/executors/__init__.py +3 -3
  52. parsl/executors/base.py +1 -0
  53. parsl/executors/flux/execute_parsl_task.py +2 -2
  54. parsl/executors/flux/executor.py +11 -12
  55. parsl/executors/flux/flux_instance_manager.py +3 -3
  56. parsl/executors/high_throughput/executor.py +29 -35
  57. parsl/executors/high_throughput/interchange.py +16 -18
  58. parsl/executors/high_throughput/manager_record.py +1 -0
  59. parsl/executors/high_throughput/monitoring_info.py +2 -1
  60. parsl/executors/high_throughput/mpi_executor.py +5 -2
  61. parsl/executors/high_throughput/mpi_prefix_composer.py +1 -1
  62. parsl/executors/high_throughput/mpi_resource_management.py +1 -2
  63. parsl/executors/high_throughput/probe.py +6 -4
  64. parsl/executors/high_throughput/process_worker_pool.py +31 -20
  65. parsl/executors/high_throughput/zmq_pipes.py +28 -14
  66. parsl/executors/radical/executor.py +15 -15
  67. parsl/executors/radical/rpex_master.py +1 -2
  68. parsl/executors/radical/rpex_resources.py +1 -2
  69. parsl/executors/radical/rpex_worker.py +2 -1
  70. parsl/executors/status_handling.py +5 -4
  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 +23 -24
  75. parsl/executors/taskvine/factory.py +1 -1
  76. parsl/executors/taskvine/manager.py +11 -13
  77. parsl/executors/threads.py +4 -5
  78. parsl/executors/workqueue/errors.py +1 -1
  79. parsl/executors/workqueue/exec_parsl_function.py +5 -4
  80. parsl/executors/workqueue/executor.py +26 -27
  81. parsl/executors/workqueue/parsl_coprocess.py +1 -1
  82. parsl/jobs/error_handlers.py +1 -1
  83. parsl/jobs/job_status_poller.py +2 -5
  84. parsl/jobs/states.py +1 -1
  85. parsl/jobs/strategy.py +2 -2
  86. parsl/launchers/__init__.py +12 -3
  87. parsl/launchers/errors.py +1 -1
  88. parsl/log_utils.py +1 -2
  89. parsl/monitoring/db_manager.py +16 -10
  90. parsl/monitoring/monitoring.py +11 -15
  91. parsl/monitoring/queries/pandas.py +1 -2
  92. parsl/monitoring/radios.py +2 -4
  93. parsl/monitoring/remote.py +13 -8
  94. parsl/monitoring/router.py +8 -11
  95. parsl/monitoring/types.py +2 -0
  96. parsl/monitoring/visualization/app.py +4 -2
  97. parsl/monitoring/visualization/models.py +0 -1
  98. parsl/monitoring/visualization/plots/default/workflow_plots.py +8 -4
  99. parsl/monitoring/visualization/plots/default/workflow_resource_plots.py +1 -0
  100. parsl/monitoring/visualization/utils.py +0 -1
  101. parsl/monitoring/visualization/views.py +16 -9
  102. parsl/multiprocessing.py +0 -1
  103. parsl/process_loggers.py +1 -2
  104. parsl/providers/__init__.py +9 -12
  105. parsl/providers/ad_hoc/ad_hoc.py +1 -1
  106. parsl/providers/aws/aws.py +2 -3
  107. parsl/providers/azure/azure.py +4 -5
  108. parsl/providers/base.py +1 -1
  109. parsl/providers/cluster_provider.py +1 -1
  110. parsl/providers/cobalt/cobalt.py +3 -3
  111. parsl/providers/condor/condor.py +4 -2
  112. parsl/providers/errors.py +2 -2
  113. parsl/providers/googlecloud/googlecloud.py +2 -1
  114. parsl/providers/grid_engine/grid_engine.py +2 -2
  115. parsl/providers/kubernetes/kube.py +5 -3
  116. parsl/providers/local/local.py +5 -1
  117. parsl/providers/lsf/lsf.py +2 -2
  118. parsl/providers/pbspro/pbspro.py +1 -1
  119. parsl/providers/slurm/slurm.py +5 -5
  120. parsl/providers/torque/torque.py +1 -1
  121. parsl/serialize/__init__.py +8 -3
  122. parsl/serialize/base.py +1 -2
  123. parsl/serialize/concretes.py +5 -4
  124. parsl/serialize/proxystore.py +3 -2
  125. parsl/tests/__init__.py +1 -1
  126. parsl/tests/configs/ad_hoc_cluster_htex.py +4 -4
  127. parsl/tests/configs/azure_single_node.py +4 -5
  128. parsl/tests/configs/bridges.py +3 -2
  129. parsl/tests/configs/cc_in2p3.py +2 -2
  130. parsl/tests/configs/comet.py +2 -1
  131. parsl/tests/configs/ec2_single_node.py +1 -2
  132. parsl/tests/configs/ec2_spot.py +1 -2
  133. parsl/tests/configs/frontera.py +3 -2
  134. parsl/tests/configs/htex_ad_hoc_cluster.py +2 -4
  135. parsl/tests/configs/htex_local.py +2 -3
  136. parsl/tests/configs/htex_local_alternate.py +8 -11
  137. parsl/tests/configs/htex_local_intask_staging.py +5 -7
  138. parsl/tests/configs/htex_local_rsync_staging.py +4 -6
  139. parsl/tests/configs/local_adhoc.py +1 -1
  140. parsl/tests/configs/local_radical.py +1 -3
  141. parsl/tests/configs/local_radical_mpi.py +2 -2
  142. parsl/tests/configs/midway.py +2 -2
  143. parsl/tests/configs/nscc_singapore.py +3 -3
  144. parsl/tests/configs/osg_htex.py +1 -1
  145. parsl/tests/configs/petrelkube.py +3 -2
  146. parsl/tests/configs/summit.py +1 -0
  147. parsl/tests/configs/swan_htex.py +2 -2
  148. parsl/tests/configs/taskvine_ex.py +3 -5
  149. parsl/tests/configs/theta.py +2 -2
  150. parsl/tests/configs/workqueue_ex.py +3 -4
  151. parsl/tests/conftest.py +4 -4
  152. parsl/tests/integration/test_channels/test_ssh_errors.py +1 -1
  153. parsl/tests/integration/test_stress/test_python_simple.py +3 -4
  154. parsl/tests/integration/test_stress/test_python_threads.py +3 -5
  155. parsl/tests/manual_tests/htex_local.py +4 -4
  156. parsl/tests/manual_tests/test_ad_hoc_htex.py +2 -1
  157. parsl/tests/manual_tests/test_basic.py +1 -0
  158. parsl/tests/manual_tests/test_fan_in_out_htex_remote.py +4 -4
  159. parsl/tests/manual_tests/test_log_filter.py +3 -1
  160. parsl/tests/manual_tests/test_memory_limits.py +6 -6
  161. parsl/tests/manual_tests/test_regression_220.py +2 -1
  162. parsl/tests/manual_tests/test_udp_simple.py +4 -3
  163. parsl/tests/manual_tests/test_worker_count.py +3 -2
  164. parsl/tests/scaling_tests/htex_local.py +2 -2
  165. parsl/tests/scaling_tests/test_scale.py +0 -9
  166. parsl/tests/scaling_tests/vineex_condor.py +1 -2
  167. parsl/tests/scaling_tests/vineex_local.py +1 -2
  168. parsl/tests/site_tests/test_provider.py +3 -1
  169. parsl/tests/site_tests/test_site.py +2 -0
  170. parsl/tests/sites/test_affinity.py +7 -5
  171. parsl/tests/sites/test_dynamic_executor.py +3 -3
  172. parsl/tests/sites/test_ec2.py +3 -2
  173. parsl/tests/sites/test_local_adhoc.py +2 -1
  174. parsl/tests/sites/test_worker_info.py +4 -3
  175. parsl/tests/test_aalst_patterns.py +0 -1
  176. parsl/tests/test_bash_apps/test_apptimeout.py +2 -2
  177. parsl/tests/test_bash_apps/test_error_codes.py +1 -4
  178. parsl/tests/test_bash_apps/test_memoize_ignore_args.py +1 -0
  179. parsl/tests/test_bash_apps/test_memoize_ignore_args_regr.py +2 -2
  180. parsl/tests/test_bash_apps/test_pipeline.py +1 -1
  181. parsl/tests/test_bash_apps/test_std_uri.py +4 -3
  182. parsl/tests/test_callables.py +2 -2
  183. parsl/tests/test_checkpointing/test_python_checkpoint_1.py +1 -0
  184. parsl/tests/test_checkpointing/test_python_checkpoint_2.py +2 -1
  185. parsl/tests/test_checkpointing/test_regression_239.py +1 -1
  186. parsl/tests/test_checkpointing/test_task_exit.py +1 -1
  187. parsl/tests/test_docs/test_from_slides.py +2 -2
  188. parsl/tests/test_docs/test_kwargs.py +1 -1
  189. parsl/tests/test_docs/test_tutorial_1.py +1 -2
  190. parsl/tests/test_docs/test_workflow1.py +2 -2
  191. parsl/tests/test_docs/test_workflow2.py +0 -1
  192. parsl/tests/test_error_handling/test_rand_fail.py +2 -2
  193. parsl/tests/test_error_handling/test_resource_spec.py +4 -2
  194. parsl/tests/test_error_handling/test_retries.py +2 -1
  195. parsl/tests/test_error_handling/test_retry_handler.py +1 -0
  196. parsl/tests/test_error_handling/test_retry_handler_failure.py +2 -1
  197. parsl/tests/test_error_handling/test_serialization_fail.py +1 -1
  198. parsl/tests/test_error_handling/test_wrap_with_logs.py +1 -0
  199. parsl/tests/test_flux.py +1 -1
  200. parsl/tests/test_htex/test_command_client_timeout.py +9 -12
  201. parsl/tests/test_htex/test_connected_blocks.py +3 -2
  202. parsl/tests/test_htex/test_cpu_affinity_explicit.py +5 -2
  203. parsl/tests/test_htex/test_disconnected_blocks.py +6 -4
  204. parsl/tests/test_htex/test_drain.py +5 -5
  205. parsl/tests/test_htex/test_htex.py +1 -2
  206. parsl/tests/test_htex/test_managers_command.py +3 -2
  207. parsl/tests/test_htex/test_multiple_disconnected_blocks.py +6 -4
  208. parsl/tests/test_monitoring/test_app_names.py +3 -2
  209. parsl/tests/test_monitoring/test_basic.py +4 -4
  210. parsl/tests/test_monitoring/test_db_locks.py +6 -3
  211. parsl/tests/test_monitoring/test_fuzz_zmq.py +6 -3
  212. parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py +5 -5
  213. parsl/tests/test_monitoring/test_incomplete_futures.py +5 -3
  214. parsl/tests/test_monitoring/test_memoization_representation.py +4 -1
  215. parsl/tests/test_monitoring/test_stdouterr.py +4 -4
  216. parsl/tests/test_monitoring/test_viz_colouring.py +1 -0
  217. parsl/tests/test_mpi_apps/test_bad_mpi_config.py +1 -1
  218. parsl/tests/test_mpi_apps/test_mpi_mode_disabled.py +2 -0
  219. parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py +7 -5
  220. parsl/tests/test_mpi_apps/test_mpi_prefix.py +4 -4
  221. parsl/tests/test_mpi_apps/test_mpi_scheduler.py +7 -2
  222. parsl/tests/test_mpi_apps/test_mpiex.py +4 -3
  223. parsl/tests/test_mpi_apps/test_resource_spec.py +9 -10
  224. parsl/tests/test_providers/test_cobalt_deprecation_warning.py +2 -0
  225. parsl/tests/test_providers/test_local_provider.py +2 -1
  226. parsl/tests/test_providers/test_pbspro_template.py +1 -1
  227. parsl/tests/test_providers/test_slurm_template.py +1 -1
  228. parsl/tests/test_providers/test_submiterror_deprecation.py +2 -1
  229. parsl/tests/test_python_apps/test_context_manager.py +4 -3
  230. parsl/tests/test_python_apps/test_dep_standard_futures.py +2 -1
  231. parsl/tests/test_python_apps/test_futures.py +2 -1
  232. parsl/tests/test_python_apps/test_join.py +0 -1
  233. parsl/tests/test_python_apps/test_lifted.py +3 -3
  234. parsl/tests/test_python_apps/test_memoize_bad_id_for_memo.py +1 -0
  235. parsl/tests/test_python_apps/test_pluggable_future_resolution.py +1 -1
  236. parsl/tests/test_radical/test_mpi_funcs.py +1 -1
  237. parsl/tests/test_regression/test_1480.py +2 -1
  238. parsl/tests/test_regression/test_1653.py +2 -1
  239. parsl/tests/test_regression/test_2652.py +1 -0
  240. parsl/tests/test_regression/test_69a.py +0 -1
  241. parsl/tests/test_regression/test_854.py +4 -2
  242. parsl/tests/test_regression/test_97_parallelism_0.py +1 -2
  243. parsl/tests/test_regression/test_98.py +0 -1
  244. parsl/tests/test_scaling/test_block_error_handler.py +9 -4
  245. parsl/tests/test_scaling/test_scale_down.py +2 -3
  246. parsl/tests/test_scaling/test_scale_down_htex_auto_scale.py +4 -5
  247. parsl/tests/test_scaling/test_scale_down_htex_unregistered.py +3 -4
  248. parsl/tests/test_scaling/test_shutdown_scalein.py +1 -2
  249. parsl/tests/test_serialization/test_2555_caching_deserializer.py +1 -1
  250. parsl/tests/test_serialization/test_basic.py +2 -1
  251. parsl/tests/test_serialization/test_htex_code_cache.py +3 -4
  252. parsl/tests/test_serialization/test_pack_resource_spec.py +2 -1
  253. parsl/tests/test_serialization/test_proxystore_configured.py +10 -5
  254. parsl/tests/test_serialization/test_proxystore_impl.py +5 -3
  255. parsl/tests/test_shutdown/test_kill_monitoring.py +3 -2
  256. parsl/tests/test_staging/staging_provider.py +2 -2
  257. parsl/tests/test_staging/test_1316.py +3 -2
  258. parsl/tests/test_staging/test_docs_1.py +1 -1
  259. parsl/tests/test_staging/test_docs_2.py +2 -1
  260. parsl/tests/test_staging/test_elaborate_noop_file.py +2 -2
  261. parsl/tests/test_staging/test_staging_https.py +2 -2
  262. parsl/tests/test_staging/test_staging_stdout.py +4 -3
  263. parsl/tests/test_staging/test_zip_in.py +6 -8
  264. parsl/tests/test_staging/test_zip_out.py +7 -9
  265. parsl/tests/test_staging/test_zip_to_zip.py +6 -8
  266. parsl/tests/test_summary.py +2 -1
  267. parsl/tests/test_thread_parallelism.py +0 -1
  268. parsl/tests/test_threads/test_configs.py +1 -1
  269. parsl/tests/test_threads/test_lazy_errors.py +2 -1
  270. parsl/usage_tracking/api.py +2 -3
  271. parsl/usage_tracking/usage.py +8 -18
  272. parsl/utils.py +13 -2
  273. parsl/version.py +1 -1
  274. {parsl-2024.5.27.data → parsl-2024.6.3.data}/scripts/exec_parsl_function.py +5 -4
  275. {parsl-2024.5.27.data → parsl-2024.6.3.data}/scripts/process_worker_pool.py +31 -20
  276. {parsl-2024.5.27.dist-info → parsl-2024.6.3.dist-info}/METADATA +2 -2
  277. parsl-2024.6.3.dist-info/RECORD +471 -0
  278. parsl-2024.5.27.dist-info/RECORD +0 -471
  279. {parsl-2024.5.27.data → parsl-2024.6.3.data}/scripts/parsl_coprocess.py +1 -1
  280. {parsl-2024.5.27.dist-info → parsl-2024.6.3.dist-info}/LICENSE +0 -0
  281. {parsl-2024.5.27.dist-info → parsl-2024.6.3.dist-info}/WHEEL +0 -0
  282. {parsl-2024.5.27.dist-info → parsl-2024.6.3.dist-info}/entry_points.txt +0 -0
  283. {parsl-2024.5.27.dist-info → parsl-2024.6.3.dist-info}/top_level.txt +0 -0
@@ -1,16 +1,15 @@
1
- import filelock
2
1
  import logging
3
2
  import os
4
- import parsl
5
3
  import zipfile
6
-
7
4
  from typing import Tuple
8
5
 
9
- from parsl.data_provider.staging import Staging
6
+ import filelock
7
+
8
+ import parsl
10
9
  from parsl.data_provider.files import File
10
+ from parsl.data_provider.staging import Staging
11
11
  from parsl.errors import ParslError
12
12
 
13
-
14
13
  logger = logging.getLogger(__name__)
15
14
 
16
15
 
parsl/dataflow/dflow.py CHANGED
@@ -1,23 +1,25 @@
1
1
  from __future__ import annotations
2
+
2
3
  import atexit
4
+ import datetime
5
+ import inspect
3
6
  import logging
4
7
  import os
5
8
  import pathlib
6
9
  import pickle
7
10
  import random
8
- import time
9
- import typeguard
10
- import inspect
11
- import threading
12
11
  import sys
13
- import datetime
12
+ import threading
13
+ import time
14
+ from concurrent.futures import Future
15
+ from functools import partial
14
16
  from getpass import getuser
15
- from typeguard import typechecked
17
+ from socket import gethostname
16
18
  from typing import Any, Callable, Dict, List, Optional, Sequence, Tuple, Union
17
19
  from uuid import uuid4
18
- from socket import gethostname
19
- from concurrent.futures import Future
20
- from functools import partial
20
+
21
+ import typeguard
22
+ from typeguard import typechecked
21
23
 
22
24
  import parsl
23
25
  from parsl.app.errors import RemoteExceptionWrapper
@@ -31,21 +33,24 @@ from parsl.dataflow.errors import BadCheckpoint, DependencyError, JoinError
31
33
  from parsl.dataflow.futures import AppFuture
32
34
  from parsl.dataflow.memoization import Memoizer
33
35
  from parsl.dataflow.rundirs import make_rundir
34
- from parsl.dataflow.states import States, FINAL_STATES, FINAL_FAILURE_STATES
36
+ from parsl.dataflow.states import FINAL_FAILURE_STATES, FINAL_STATES, States
35
37
  from parsl.dataflow.taskrecord import TaskRecord
36
- from parsl.errors import ConfigurationError, InternalConsistencyError, NoDataFlowKernelError
37
- from parsl.jobs.job_status_poller import JobStatusPoller
38
- from parsl.usage_tracking.usage import UsageTracker
38
+ from parsl.errors import (
39
+ ConfigurationError,
40
+ InternalConsistencyError,
41
+ NoDataFlowKernelError,
42
+ )
39
43
  from parsl.executors.base import ParslExecutor
40
44
  from parsl.executors.status_handling import BlockProviderExecutor
41
45
  from parsl.executors.threads import ThreadPoolExecutor
46
+ from parsl.jobs.job_status_poller import JobStatusPoller
42
47
  from parsl.monitoring import MonitoringHub
48
+ from parsl.monitoring.message_type import MessageType
43
49
  from parsl.monitoring.remote import monitor_wrapper
44
50
  from parsl.process_loggers import wrap_with_logs
45
51
  from parsl.providers.base import ExecutionProvider
46
- from parsl.utils import get_version, get_std_fname_mode, get_all_checkpoints, Timer
47
-
48
- from parsl.monitoring.message_type import MessageType
52
+ from parsl.usage_tracking.usage import UsageTracker
53
+ from parsl.utils import Timer, get_all_checkpoints, get_std_fname_mode, get_version
49
54
 
50
55
  logger = logging.getLogger(__name__)
51
56
 
parsl/dataflow/errors.py CHANGED
@@ -1,6 +1,7 @@
1
- from parsl.errors import ParslError
2
1
  from typing import Optional, Sequence, Tuple
3
2
 
3
+ from parsl.errors import ParslError
4
+
4
5
 
5
6
  class DataFlowException(ParslError):
6
7
  """Base class for all exceptions.
parsl/dataflow/futures.py CHANGED
@@ -1,12 +1,11 @@
1
1
  from __future__ import annotations
2
2
 
3
- from concurrent.futures import Future
4
3
  import logging
5
4
  import threading
5
+ from concurrent.futures import Future
6
6
  from typing import Any, Optional, Sequence, Union
7
7
 
8
8
  import parsl.app.app as app
9
-
10
9
  from parsl.app.futures import DataFuture
11
10
  from parsl.dataflow.taskrecord import TaskRecord
12
11
 
@@ -1,18 +1,18 @@
1
1
  from __future__ import annotations
2
+
2
3
  import hashlib
3
- from functools import lru_cache, singledispatch
4
4
  import logging
5
5
  import pickle
6
- from parsl.dataflow.taskrecord import TaskRecord
6
+ from functools import lru_cache, singledispatch
7
+ from typing import TYPE_CHECKING, Any, Dict, List, Optional
7
8
 
8
- from typing import Dict, Any, List, Optional, TYPE_CHECKING
9
+ from parsl.dataflow.taskrecord import TaskRecord
9
10
 
10
11
  if TYPE_CHECKING:
11
12
  from parsl import DataFlowKernel # import loop at runtime - needed for typechecking - TODO turn into "if typing:"
12
13
 
13
- from concurrent.futures import Future
14
-
15
14
  import types
15
+ from concurrent.futures import Future
16
16
 
17
17
  logger = logging.getLogger(__name__)
18
18
 
parsl/dataflow/rundirs.py CHANGED
@@ -1,6 +1,6 @@
1
+ import logging
1
2
  import os
2
3
  from glob import glob
3
- import logging
4
4
 
5
5
  logger = logging.getLogger(__name__)
6
6
 
@@ -1,19 +1,18 @@
1
1
  from __future__ import annotations
2
2
 
3
- import threading
4
3
  import datetime
5
- from typing_extensions import TypedDict
4
+ import threading
6
5
  from concurrent.futures import Future
7
6
 
8
-
9
7
  # only for type checking:
10
- from typing import Any, Callable, Dict, Optional, List, Sequence, TYPE_CHECKING, Union
8
+ from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, Sequence, Union
9
+
10
+ from typing_extensions import TypedDict
11
11
 
12
12
  if TYPE_CHECKING:
13
13
  from parsl.dataflow.futures import AppFuture
14
14
 
15
15
  import parsl.dataflow.dflow as dflow
16
-
17
16
  from parsl.dataflow.states import States
18
17
 
19
18
 
@@ -1,8 +1,8 @@
1
- from parsl.executors.threads import ThreadPoolExecutor
2
- from parsl.executors.workqueue.executor import WorkQueueExecutor
1
+ from parsl.executors.flux.executor import FluxExecutor
3
2
  from parsl.executors.high_throughput.executor import HighThroughputExecutor
4
3
  from parsl.executors.high_throughput.mpi_executor import MPIExecutor
5
- from parsl.executors.flux.executor import FluxExecutor
4
+ from parsl.executors.threads import ThreadPoolExecutor
5
+ from parsl.executors.workqueue.executor import WorkQueueExecutor
6
6
 
7
7
  __all__ = ['ThreadPoolExecutor',
8
8
  'HighThroughputExecutor',
parsl/executors/base.py CHANGED
@@ -2,6 +2,7 @@ import os
2
2
  from abc import ABCMeta, abstractmethod
3
3
  from concurrent.futures import Future
4
4
  from typing import Any, Callable, Dict, Optional
5
+
5
6
  from typing_extensions import Literal, Self
6
7
 
7
8
  from parsl.monitoring.radios import MonitoringRadio
@@ -1,12 +1,12 @@
1
1
  """Script for executing tasks inside of Flux jobs."""
2
2
 
3
3
  import argparse
4
- import os
5
4
  import logging
5
+ import os
6
6
 
7
+ from parsl.executors.flux import TaskResult
7
8
  from parsl.executors.high_throughput.process_worker_pool import execute_task
8
9
  from parsl.serialize import serialize
9
- from parsl.executors.flux import TaskResult
10
10
 
11
11
 
12
12
  def main():
@@ -1,33 +1,32 @@
1
1
  """Defines the FluxExecutor class."""
2
2
 
3
+ import collections
3
4
  import concurrent.futures as cf
4
5
  import functools
6
+ import itertools
5
7
  import os
8
+ import queue
9
+ import shutil
6
10
  import sys
7
- import uuid
8
11
  import threading
9
- import itertools
10
- import shutil
11
- import queue
12
- from socket import gethostname
13
- import collections
14
- from collections.abc import Mapping, Callable
15
- from typing import Optional, Any, Dict
12
+ import uuid
16
13
  import weakref
14
+ from collections.abc import Callable, Mapping
15
+ from socket import gethostname
16
+ from typing import Any, Dict, Optional
17
17
 
18
18
  import zmq
19
19
 
20
- from parsl.utils import RepresentationMixin
20
+ from parsl.app.errors import AppException
21
21
  from parsl.executors.base import ParslExecutor
22
+ from parsl.executors.errors import ScalingFailed
22
23
  from parsl.executors.flux.execute_parsl_task import __file__ as _WORKER_PATH
23
24
  from parsl.executors.flux.flux_instance_manager import __file__ as _MANAGER_PATH
24
- from parsl.executors.errors import ScalingFailed
25
25
  from parsl.providers import LocalProvider
26
26
  from parsl.providers.base import ExecutionProvider
27
27
  from parsl.serialize import deserialize, pack_res_spec_apply_message
28
28
  from parsl.serialize.errors import SerializationError
29
- from parsl.app.errors import AppException
30
-
29
+ from parsl.utils import RepresentationMixin
31
30
 
32
31
  _WORKER_PATH = os.path.realpath(_WORKER_PATH)
33
32
  _MANAGER_PATH = os.path.realpath(_MANAGER_PATH)
@@ -1,10 +1,10 @@
1
1
  """Script meant to be the initial program of a Flux instance."""
2
2
 
3
3
  import argparse
4
+ import logging
4
5
  import os
5
6
  from os.path import dirname
6
- import logging
7
- from socket import gethostname, gethostbyname
7
+ from socket import gethostbyname, gethostname
8
8
 
9
9
  import zmq
10
10
 
@@ -16,8 +16,8 @@ def main():
16
16
  encapsulating Flux instance.
17
17
  """
18
18
  # flux imports only available when launched under Flux instance
19
- import flux.job
20
19
  import flux
20
+ import flux.job
21
21
 
22
22
  logging.basicConfig(
23
23
  level=logging.DEBUG, format="%(asctime)s [%(levelname)s] %(message)s"
@@ -1,44 +1,39 @@
1
+ import logging
2
+ import math
3
+ import pickle
4
+ import threading
1
5
  import typing
6
+ import warnings
2
7
  from collections import defaultdict
3
8
  from concurrent.futures import Future
4
- import typeguard
5
- import logging
6
- import threading
7
- import queue
8
- import pickle
9
9
  from dataclasses import dataclass
10
- from multiprocessing import Process, Queue
11
- from typing import Dict, Sequence
12
- from typing import List, Optional, Tuple, Union, Callable
13
- import math
14
- import warnings
10
+ from multiprocessing import Process
11
+ from typing import Callable, Dict, List, Optional, Sequence, Tuple, Union
12
+
13
+ import typeguard
15
14
 
16
15
  import parsl.launchers
17
- from parsl.usage_tracking.api import UsageInformation
18
- from parsl.serialize import pack_res_spec_apply_message, deserialize
19
- from parsl.serialize.errors import SerializationError, DeserializationError
16
+ from parsl import curvezmq
17
+ from parsl.addresses import get_all_addresses
20
18
  from parsl.app.errors import RemoteExceptionWrapper
21
- from parsl.jobs.states import JobStatus, JobState, TERMINAL_STATES
22
- from parsl.executors.high_throughput import zmq_pipes
23
- from parsl.executors.high_throughput import interchange
24
- from parsl.executors.errors import (
25
- BadMessage, ScalingFailed,
26
- )
19
+ from parsl.data_provider.staging import Staging
20
+ from parsl.executors.errors import BadMessage, ScalingFailed
21
+ from parsl.executors.high_throughput import interchange, zmq_pipes
22
+ from parsl.executors.high_throughput.errors import CommandClientTimeoutError
27
23
  from parsl.executors.high_throughput.mpi_prefix_composer import (
28
24
  VALID_LAUNCHERS,
29
- validate_resource_spec
25
+ validate_resource_spec,
30
26
  )
31
-
32
- from parsl import curvezmq
33
27
  from parsl.executors.status_handling import BlockProviderExecutor
34
- from parsl.providers.base import ExecutionProvider
35
- from parsl.data_provider.staging import Staging
36
- from parsl.addresses import get_all_addresses
37
- from parsl.process_loggers import wrap_with_logs
38
-
28
+ from parsl.jobs.states import TERMINAL_STATES, JobState, JobStatus
39
29
  from parsl.multiprocessing import ForkProcess
40
- from parsl.utils import RepresentationMixin
30
+ from parsl.process_loggers import wrap_with_logs
41
31
  from parsl.providers import LocalProvider
32
+ from parsl.providers.base import ExecutionProvider
33
+ from parsl.serialize import deserialize, pack_res_spec_apply_message
34
+ from parsl.serialize.errors import DeserializationError, SerializationError
35
+ from parsl.usage_tracking.api import UsageInformation
36
+ from parsl.utils import RepresentationMixin
42
37
 
43
38
  logger = logging.getLogger(__name__)
44
39
 
@@ -415,13 +410,13 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
415
410
  )
416
411
 
417
412
  self.outgoing_q = zmq_pipes.TasksOutgoing(
418
- curvezmq.ClientContext(self.cert_dir), "127.0.0.1", self.interchange_port_range
413
+ "127.0.0.1", self.interchange_port_range, self.cert_dir
419
414
  )
420
415
  self.incoming_q = zmq_pipes.ResultsIncoming(
421
- curvezmq.ClientContext(self.cert_dir), "127.0.0.1", self.interchange_port_range
416
+ "127.0.0.1", self.interchange_port_range, self.cert_dir
422
417
  )
423
418
  self.command_client = zmq_pipes.CommandClient(
424
- curvezmq.ClientContext(self.cert_dir), "127.0.0.1", self.interchange_port_range
419
+ "127.0.0.1", self.interchange_port_range, self.cert_dir
425
420
  )
426
421
 
427
422
  self._queue_management_thread = None
@@ -531,9 +526,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
531
526
  Starts the interchange process locally and uses an internal command queue to
532
527
  get the worker task and result ports that the interchange has bound to.
533
528
  """
534
- comm_q = Queue(maxsize=10)
535
529
  self.interchange_proc = ForkProcess(target=interchange.starter,
536
- args=(comm_q,),
537
530
  kwargs={"client_ports": (self.outgoing_q.port,
538
531
  self.incoming_q.port,
539
532
  self.command_client.port),
@@ -552,9 +545,10 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
552
545
  name="HTEX-Interchange"
553
546
  )
554
547
  self.interchange_proc.start()
548
+
555
549
  try:
556
- (self.worker_task_port, self.worker_result_port) = comm_q.get(block=True, timeout=120)
557
- except queue.Empty:
550
+ (self.worker_task_port, self.worker_result_port) = self.command_client.run("WORKER_PORTS", timeout_s=120)
551
+ except CommandClientTimeoutError:
558
552
  logger.error("Interchange has not completed initialization in 120s. Aborting")
559
553
  raise Exception("Interchange failed to start")
560
554
 
@@ -1,31 +1,28 @@
1
1
  #!/usr/bin/env python
2
- import multiprocessing
3
- import zmq
2
+ import datetime
3
+ import json
4
+ import logging
4
5
  import os
5
- import sys
6
+ import pickle
6
7
  import platform
8
+ import queue
7
9
  import random
8
- import time
9
- import datetime
10
- import pickle
11
10
  import signal
12
- import logging
13
- import queue
11
+ import sys
14
12
  import threading
15
- import json
13
+ import time
14
+ from typing import Any, Dict, List, NoReturn, Optional, Sequence, Set, Tuple, cast
16
15
 
17
- from typing import cast, Any, Dict, NoReturn, Sequence, Set, Optional, Tuple, List
16
+ import zmq
18
17
 
19
18
  from parsl import curvezmq
20
- from parsl.utils import setproctitle
21
- from parsl.version import VERSION as PARSL_VERSION
22
- from parsl.serialize import serialize as serialize_object
23
-
24
19
  from parsl.app.errors import RemoteExceptionWrapper
25
20
  from parsl.executors.high_throughput.manager_record import ManagerRecord
26
21
  from parsl.monitoring.message_type import MessageType
27
22
  from parsl.process_loggers import wrap_with_logs
28
-
23
+ from parsl.serialize import serialize as serialize_object
24
+ from parsl.utils import setproctitle
25
+ from parsl.version import VERSION as PARSL_VERSION
29
26
 
30
27
  PKL_HEARTBEAT_CODE = pickle.dumps((2 ** 32) - 1)
31
28
  PKL_DRAINED_CODE = pickle.dumps((2 ** 32) - 2)
@@ -328,6 +325,9 @@ class Interchange:
328
325
 
329
326
  reply = None
330
327
 
328
+ elif command_req == "WORKER_PORTS":
329
+ reply = (self.worker_task_port, self.worker_result_port)
330
+
331
331
  else:
332
332
  logger.error(f"Received unknown command: {command_req}")
333
333
  reply = None
@@ -672,7 +672,7 @@ def start_file_logger(filename: str, level: int = logging.DEBUG, format_string:
672
672
 
673
673
 
674
674
  @wrap_with_logs(target="interchange")
675
- def starter(comm_q: multiprocessing.Queue, *args: Any, **kwargs: Any) -> None:
675
+ def starter(*args: Any, **kwargs: Any) -> None:
676
676
  """Start the interchange process
677
677
 
678
678
  The executor is expected to call this function. The args, kwargs match that of the Interchange.__init__
@@ -680,6 +680,4 @@ def starter(comm_q: multiprocessing.Queue, *args: Any, **kwargs: Any) -> None:
680
680
  setproctitle("parsl: HTEX interchange")
681
681
  # logger = multiprocessing.get_logger()
682
682
  ic = Interchange(*args, **kwargs)
683
- comm_q.put((ic.worker_task_port,
684
- ic.worker_result_port))
685
683
  ic.start()
@@ -1,5 +1,6 @@
1
1
  from datetime import datetime
2
2
  from typing import Any, List, Optional
3
+
3
4
  from typing_extensions import TypedDict
4
5
 
5
6
 
@@ -3,6 +3,7 @@
3
3
  # then be acquired by any other code running in
4
4
  # a worker context - specifically the monitoring
5
5
  # wrapper code.
6
- from typing import Optional
7
6
  from queue import Queue
7
+ from typing import Optional
8
+
8
9
  result_queue: Optional[Queue] = None
@@ -1,10 +1,13 @@
1
1
  """A simplified interface for HTEx when running in MPI mode"""
2
- from typing import Optional, Tuple, List, Union, Callable, Dict
2
+ from typing import Callable, Dict, List, Optional, Tuple, Union
3
3
 
4
4
  import typeguard
5
5
 
6
6
  from parsl.data_provider.staging import Staging
7
- from parsl.executors.high_throughput.executor import HighThroughputExecutor, GENERAL_HTEX_PARAM_DOCS
7
+ from parsl.executors.high_throughput.executor import (
8
+ GENERAL_HTEX_PARAM_DOCS,
9
+ HighThroughputExecutor,
10
+ )
8
11
  from parsl.executors.status_handling import BlockProviderExecutor
9
12
  from parsl.jobs.states import JobStatus
10
13
  from parsl.providers import LocalProvider
@@ -1,5 +1,5 @@
1
1
  import logging
2
- from typing import Dict, List, Tuple, Set
2
+ from typing import Dict, List, Set, Tuple
3
3
 
4
4
  logger = logging.getLogger(__name__)
5
5
 
@@ -8,8 +8,7 @@ from enum import Enum
8
8
  from typing import Dict, List
9
9
 
10
10
  from parsl.multiprocessing import SpawnContext
11
- from parsl.serialize import (pack_res_spec_apply_message,
12
- unpack_res_spec_apply_message)
11
+ from parsl.serialize import pack_res_spec_apply_message, unpack_res_spec_apply_message
13
12
 
14
13
  logger = logging.getLogger(__name__)
15
14
 
@@ -1,11 +1,13 @@
1
- import zmq
2
1
  import argparse
3
- import uuid
4
- import time
5
2
  import logging
6
- from parsl.addresses import get_all_addresses
3
+ import time
4
+ import uuid
5
+
6
+ import zmq
7
7
  from zmq.utils.monitor import recv_monitor_message
8
8
 
9
+ from parsl.addresses import get_all_addresses
10
+
9
11
  logger = logging.getLogger(__name__)
10
12
 
11
13
 
@@ -1,39 +1,41 @@
1
1
  #!/usr/bin/env python3
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