parsl 2025.9.8__py3-none-any.whl → 2025.9.22__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.

Potentially problematic release.


This version of parsl might be problematic. Click here for more details.

Files changed (39) hide show
  1. parsl/curvezmq.py +0 -16
  2. parsl/executors/execute_task.py +2 -8
  3. parsl/executors/flux/executor.py +3 -5
  4. parsl/executors/high_throughput/executor.py +10 -4
  5. parsl/executors/high_throughput/interchange.py +14 -4
  6. parsl/executors/high_throughput/mpi_resource_management.py +1 -7
  7. parsl/executors/high_throughput/process_worker_pool.py +5 -1
  8. parsl/executors/high_throughput/zmq_pipes.py +29 -43
  9. parsl/executors/radical/executor.py +2 -6
  10. parsl/executors/radical/rpex_worker.py +2 -2
  11. parsl/monitoring/monitoring.py +2 -2
  12. parsl/multiprocessing.py +0 -49
  13. parsl/serialize/__init__.py +6 -9
  14. parsl/serialize/facade.py +0 -32
  15. parsl/tests/test_curvezmq.py +0 -42
  16. parsl/tests/test_execute_task.py +2 -11
  17. parsl/tests/test_htex/test_command_concurrency_regression_1321.py +54 -0
  18. parsl/tests/test_htex/test_interchange_exit_bad_registration.py +2 -1
  19. parsl/tests/test_htex/test_priority_queue.py +8 -2
  20. parsl/tests/test_htex/test_zmq_binding.py +2 -1
  21. parsl/tests/test_mpi_apps/test_mpi_scheduler.py +18 -43
  22. parsl/version.py +1 -1
  23. {parsl-2025.9.8.data → parsl-2025.9.22.data}/scripts/interchange.py +14 -4
  24. {parsl-2025.9.8.data → parsl-2025.9.22.data}/scripts/process_worker_pool.py +5 -1
  25. {parsl-2025.9.8.dist-info → parsl-2025.9.22.dist-info}/METADATA +2 -2
  26. {parsl-2025.9.8.dist-info → parsl-2025.9.22.dist-info}/RECORD +32 -38
  27. parsl/tests/site_tests/test_provider.py +0 -88
  28. parsl/tests/site_tests/test_site.py +0 -70
  29. parsl/tests/test_aalst_patterns.py +0 -474
  30. parsl/tests/test_docs/test_workflow2.py +0 -42
  31. parsl/tests/test_error_handling/test_rand_fail.py +0 -171
  32. parsl/tests/test_regression/test_854.py +0 -62
  33. parsl/tests/test_serialization/test_pack_resource_spec.py +0 -23
  34. {parsl-2025.9.8.data → parsl-2025.9.22.data}/scripts/exec_parsl_function.py +0 -0
  35. {parsl-2025.9.8.data → parsl-2025.9.22.data}/scripts/parsl_coprocess.py +0 -0
  36. {parsl-2025.9.8.dist-info → parsl-2025.9.22.dist-info}/LICENSE +0 -0
  37. {parsl-2025.9.8.dist-info → parsl-2025.9.22.dist-info}/WHEEL +0 -0
  38. {parsl-2025.9.8.dist-info → parsl-2025.9.22.dist-info}/entry_points.txt +0 -0
  39. {parsl-2025.9.8.dist-info → parsl-2025.9.22.dist-info}/top_level.txt +0 -0
@@ -1,3 +1,5 @@
1
+ from random import randint
2
+
1
3
  import pytest
2
4
 
3
5
  import parsl
@@ -40,12 +42,16 @@ def test_priority_queue():
40
42
  futures = {}
41
43
 
42
44
  # Submit tasks with mixed priorities
43
- # Priorities: [10, 10, 5, 5, 1, 1] to test fallback behavior
44
- for i, priority in enumerate([10, 10, 5, 5, 1, 1]):
45
+ # Test fallback behavior with a guaranteed-unsorted priorities
46
+ priorities = [randint(2, 9) for _ in range(randint(1, 10))]
47
+ priorities.insert(0, 10)
48
+ priorities.extend((1, 10, 1))
49
+ for i, priority in enumerate(priorities):
45
50
  spec = {'priority': priority}
46
51
  futures[(priority, i)] = fake_task(parsl_resource_specification=spec)
47
52
 
48
53
  provider.max_blocks = 1
54
+ htex.scale_out_facade(1) # don't wait for the JSP to catch up
49
55
 
50
56
  # Wait for completion
51
57
  results = {
@@ -29,7 +29,8 @@ def make_interchange(*,
29
29
  logging_level=logging.INFO,
30
30
  manager_selector=RandomManagerSelector(),
31
31
  poll_period=10,
32
- run_id="test_run_id")
32
+ run_id="test_run_id",
33
+ _check_python_mismatch=True)
33
34
 
34
35
 
35
36
  @pytest.fixture
@@ -1,4 +1,3 @@
1
- import logging
2
1
  import os
3
2
  import pickle
4
3
  from unittest import mock
@@ -10,7 +9,9 @@ from parsl.executors.high_throughput.mpi_resource_management import (
10
9
  TaskScheduler,
11
10
  )
12
11
  from parsl.multiprocessing import SpawnContext
13
- from parsl.serialize import pack_res_spec_apply_message, unpack_res_spec_apply_message
12
+ from parsl.serialize import pack_apply_message
13
+
14
+ mock_task_buffer = pack_apply_message("func", "args", "kwargs")
14
15
 
15
16
 
16
17
  @pytest.fixture(autouse=True)
@@ -42,12 +43,8 @@ def test_MPISched_put_task():
42
43
  assert len(scheduler.available_nodes) == 8
43
44
  assert scheduler._free_node_counter.value == 8
44
45
 
45
- mock_task_buffer = pack_res_spec_apply_message("func",
46
- "args",
47
- "kwargs",
48
- resource_specification={"num_nodes": 2,
49
- "ranks_per_node": 2})
50
- task_package = {"task_id": 1, "buffer": mock_task_buffer}
46
+ res_spec = {"num_nodes": 2, "ranks_per_node": 2}
47
+ task_package = {"task_id": 1, "buffer": mock_task_buffer, "resource_spec": res_spec}
51
48
  scheduler.put_task(task_package)
52
49
 
53
50
  assert scheduler._free_node_counter.value == 6
@@ -82,21 +79,17 @@ def test_MPISched_roundtrip():
82
79
  assert scheduler.available_nodes
83
80
  assert len(scheduler.available_nodes) == 8
84
81
 
85
- for round in range(1, 9):
82
+ for trip in range(1, 9):
86
83
  assert scheduler._free_node_counter.value == 8
87
84
 
88
- mock_task_buffer = pack_res_spec_apply_message("func",
89
- "args",
90
- "kwargs",
91
- resource_specification={"num_nodes": round,
92
- "ranks_per_node": 2})
93
- task_package = {"task_id": round, "buffer": mock_task_buffer}
85
+ res_spec = {"num_nodes": trip, "ranks_per_node": 2}
86
+ task_package = {"task_id": trip, "buffer": mock_task_buffer, "resource_spec": res_spec}
94
87
  scheduler.put_task(task_package)
95
88
 
96
- assert scheduler._free_node_counter.value == 8 - round
89
+ assert scheduler._free_node_counter.value == 8 - trip
97
90
 
98
91
  # Pop in a mock result
99
- result_pkl = pickle.dumps({"task_id": round, "type": "result", "buffer": "RESULT BUF"})
92
+ result_pkl = pickle.dumps({"task_id": trip, "type": "result", "buffer": "RESULT BUF"})
100
93
  result_q.put(result_pkl)
101
94
 
102
95
  got_result = scheduler.get_result(True, 1)
@@ -114,27 +107,15 @@ def test_MPISched_contention():
114
107
 
115
108
  assert scheduler._free_node_counter.value == 8
116
109
 
117
- mock_task_buffer = pack_res_spec_apply_message("func",
118
- "args",
119
- "kwargs",
120
- resource_specification={
121
- "num_nodes": 8,
122
- "ranks_per_node": 2
123
- })
124
- task_package = {"task_id": 1, "buffer": mock_task_buffer}
110
+ rspec_1 = {"num_nodes": 8, "ranks_per_node": 2}
111
+ task_package = {"task_id": 1, "buffer": mock_task_buffer, "resource_spec": rspec_1}
125
112
  scheduler.put_task(task_package)
126
113
 
127
114
  assert scheduler._free_node_counter.value == 0
128
115
  assert scheduler._backlog_queue.empty()
129
116
 
130
- mock_task_buffer = pack_res_spec_apply_message("func",
131
- "args",
132
- "kwargs",
133
- resource_specification={
134
- "num_nodes": 8,
135
- "ranks_per_node": 2
136
- })
137
- task_package = {"task_id": 2, "buffer": mock_task_buffer}
117
+ rspec_2 = {"num_nodes": 8, "ranks_per_node": 2}
118
+ task_package = {"task_id": 2, "buffer": mock_task_buffer, "resource_spec": rspec_2}
138
119
  scheduler.put_task(task_package)
139
120
 
140
121
  # Second task should now be in the backlog_queue
@@ -143,8 +124,7 @@ def test_MPISched_contention():
143
124
  # Confirm that the first task is available and has all 8 nodes provisioned
144
125
  task_on_worker_side = task_q.get()
145
126
  assert task_on_worker_side['task_id'] == 1
146
- _, _, _, resource_spec = unpack_res_spec_apply_message(task_on_worker_side['buffer'])
147
- assert len(resource_spec['MPI_NODELIST'].split(',')) == 8
127
+ assert len(rspec_1["MPI_NODELIST"].split(",")) == 8
148
128
  assert task_q.empty() # Confirm that task 2 is not yet scheduled
149
129
 
150
130
  # Simulate worker returning result and the scheduler picking up result
@@ -159,8 +139,7 @@ def test_MPISched_contention():
159
139
  # Pop in a mock result
160
140
  task_on_worker_side = task_q.get()
161
141
  assert task_on_worker_side['task_id'] == 2
162
- _, _, _, resource_spec = unpack_res_spec_apply_message(task_on_worker_side['buffer'])
163
- assert len(resource_spec['MPI_NODELIST'].split(',')) == 8
142
+ assert len(rspec_2["MPI_NODELIST"].split(",")) == 8
164
143
 
165
144
 
166
145
  @pytest.mark.local
@@ -178,11 +157,7 @@ def test_hashable_backlog_queue():
178
157
  assert scheduler._free_node_counter.value == 8
179
158
 
180
159
  for i in range(3):
181
- mock_task_buffer = pack_res_spec_apply_message("func", "args", "kwargs",
182
- resource_specification={
183
- "num_nodes": 8,
184
- "ranks_per_node": 2
185
- })
186
- task_package = {"task_id": i, "buffer": mock_task_buffer}
160
+ res_spec = {"num_nodes": 8, "ranks_per_node": 2}
161
+ task_package = {"task_id": i, "buffer": mock_task_buffer, "resource_spec": res_spec}
187
162
  scheduler.put_task(task_package)
188
163
  assert scheduler._backlog_queue.qsize() == 2, "Expected 2 backlogged tasks"
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 = '2025.09.08'
6
+ VERSION = '2025.09.22'
@@ -23,7 +23,6 @@ from parsl.monitoring.radios.base import MonitoringRadioSender
23
23
  from parsl.monitoring.radios.zmq import ZMQRadioSender
24
24
  from parsl.process_loggers import wrap_with_logs
25
25
  from parsl.serialize import serialize as serialize_object
26
- from parsl.utils import setproctitle
27
26
  from parsl.version import VERSION as PARSL_VERSION
28
27
 
29
28
  PKL_HEARTBEAT_CODE = pickle.dumps((2 ** 32) - 1)
@@ -56,6 +55,7 @@ class Interchange:
56
55
  cert_dir: Optional[str],
57
56
  manager_selector: ManagerSelector,
58
57
  run_id: str,
58
+ _check_python_mismatch: bool,
59
59
  ) -> None:
60
60
  """
61
61
  Parameters
@@ -99,6 +99,11 @@ class Interchange:
99
99
 
100
100
  cert_dir : str | None
101
101
  Path to the certificate directory.
102
+
103
+ _check_python_mismatch : bool
104
+ If True, the interchange and worker managers must run the same version of
105
+ Python. Running different versions can cause inter-process communication
106
+ errors, so proceed with caution.
102
107
  """
103
108
  self.cert_dir = cert_dir
104
109
  self.logdir = logdir
@@ -126,6 +131,7 @@ class Interchange:
126
131
  logger.info("Connected to client")
127
132
 
128
133
  self.run_id = run_id
134
+ self._check_python_mismatch = _check_python_mismatch
129
135
 
130
136
  self.hub_address = hub_address
131
137
  self.hub_zmq_port = hub_zmq_port
@@ -213,7 +219,7 @@ class Interchange:
213
219
 
214
220
  reply: Any # the type of reply depends on the command_req received (aka this needs dependent types...)
215
221
 
216
- if self.command_channel in self.socks and self.socks[self.command_channel] == zmq.POLLIN:
222
+ if self.socks.get(self.command_channel) == zmq.POLLIN:
217
223
  logger.debug("entering command_server section")
218
224
 
219
225
  command_req = self.command_channel.recv_pyobj()
@@ -321,7 +327,7 @@ class Interchange:
321
327
  """Process incoming task message(s).
322
328
  """
323
329
 
324
- if self.task_incoming in self.socks and self.socks[self.task_incoming] == zmq.POLLIN:
330
+ if self.socks.get(self.task_incoming) == zmq.POLLIN:
325
331
  logger.debug("start task_incoming section")
326
332
  msg = self.task_incoming.recv_pyobj()
327
333
 
@@ -396,7 +402,9 @@ class Interchange:
396
402
  logger.info(f'Registration info for manager {manager_id!r}: {meta}')
397
403
  self._send_monitoring_info(monitoring_radio, new_rec)
398
404
 
399
- if (mgr_minor_py, mgr_parsl_v) != (ix_minor_py, ix_parsl_v):
405
+ python_mismatch: bool = ix_minor_py != mgr_minor_py
406
+ parsl_mismatch: bool = ix_parsl_v != mgr_parsl_v
407
+ if parsl_mismatch or (self._check_python_mismatch and python_mismatch):
400
408
  kill_event.set()
401
409
  vm_exc = VersionMismatch(
402
410
  f"py.v={ix_minor_py} parsl.v={ix_parsl_v}",
@@ -618,6 +626,8 @@ def start_file_logger(filename: str, level: int = logging.DEBUG, format_string:
618
626
 
619
627
 
620
628
  if __name__ == "__main__":
629
+ from parsl.utils import setproctitle
630
+
621
631
  setproctitle("parsl: HTEX interchange")
622
632
 
623
633
  config = pickle.load(sys.stdin.buffer)
@@ -603,6 +603,10 @@ def update_resource_spec_env_vars(mpi_launcher: str, resource_spec: Dict, node_i
603
603
 
604
604
 
605
605
  def _init_mpi_env(mpi_launcher: str, resource_spec: Dict):
606
+ for varname in resource_spec:
607
+ envname = "PARSL_" + str(varname).upper()
608
+ os.environ[envname] = str(resource_spec[varname])
609
+
606
610
  node_list = resource_spec.get("MPI_NODELIST")
607
611
  if node_list is None:
608
612
  return
@@ -753,8 +757,8 @@ def worker(
753
757
  worker_enqueued = True
754
758
 
755
759
  try:
756
- # The worker will receive {'task_id':<tid>, 'buffer':<buf>}
757
760
  req = task_queue.get(timeout=task_queue_timeout)
761
+ # req is {'task_id':<tid>, 'buffer':<buf>, 'resource_spec':<dict>}
758
762
  except queue.Empty:
759
763
  continue
760
764
 
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: parsl
3
- Version: 2025.9.8
3
+ Version: 2025.9.22
4
4
  Summary: Simple data dependent workflows in Python
5
5
  Home-page: https://github.com/Parsl/parsl
6
- Download-URL: https://github.com/Parsl/parsl/archive/2025.09.08.tar.gz
6
+ Download-URL: https://github.com/Parsl/parsl/archive/2025.09.22.tar.gz
7
7
  Author: The Parsl Team
8
8
  Author-email: parsl@googlegroups.com
9
9
  License: Apache 2.0
@@ -1,14 +1,14 @@
1
1
  parsl/__init__.py,sha256=QaS0vxlxGVp2UYEIGcYYiUMOZJKSrQOXFR2X_KozL88,1641
2
2
  parsl/addresses.py,sha256=z5GnIWdbzz4klRiMZtX8XmRT7OP8dJYvAk8RIKD2kzI,5290
3
3
  parsl/config.py,sha256=p5HQoxLj5aMagUAYfngcXG2kw0s6SJoc6u7vH2sVhPU,9635
4
- parsl/curvezmq.py,sha256=6Zi7RqTP_eKWi3DFgapfK2t-Jw8vJS-ZtN1bsrByPeo,7073
4
+ parsl/curvezmq.py,sha256=QQh-Wp7CxvKxExIkjRkwt_UB5ooglkkuOgjEc7SF0fE,6582
5
5
  parsl/errors.py,sha256=SzINzQFZDBDbj9l-DPQznD0TbGkNhHIRAPkcBCogf_A,1019
6
6
  parsl/log_utils.py,sha256=7L3uzvK9ew11pj5D25us-Hs12QTL_jwXNs1LL8dZhOI,3559
7
- parsl/multiprocessing.py,sha256=JNAfgdZvQSsxVyUp229OOUqWwf_ZUhpmw8X9CdF3i6k,3614
7
+ parsl/multiprocessing.py,sha256=xqieTLko3DrHykCqqSHQszMwd8ORYllrgz6Qc_PsHCE,2112
8
8
  parsl/process_loggers.py,sha256=uQ7Gd0W72Jz7rrcYlOMfLsAEhkRltxXJL2MgdduJjEw,1136
9
9
  parsl/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
10
10
  parsl/utils.py,sha256=smVYTusMoYUTD5N9OxTW5bh6o2iioh0NnfjrBAj8zYk,14452
11
- parsl/version.py,sha256=jssTePzsql4ZyUWL8yCicTMRJRPaLyu8nXV2_BUgI0E,131
11
+ parsl/version.py,sha256=1FmTAxb_oLz19QvMrCDIghwk5d3IAI0plHgiPluzCgI,131
12
12
  parsl/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
13
  parsl/app/app.py,sha256=0gbM4AH2OtFOLsv07I5nglpElcwMSOi-FzdZZfrk7So,8532
14
14
  parsl/app/bash.py,sha256=jm2AvePlCT9DZR7H_4ANDWxatp5dN_22FUlT_gWhZ-g,5528
@@ -65,31 +65,31 @@ parsl/dataflow/taskrecord.py,sha256=qIW7T6hn9dYTuNPdUura3HQwwUpUJACwPP5REm5COf4,
65
65
  parsl/executors/__init__.py,sha256=PEuXYrnVqwlaz_nt82s9D_YNaVsX7ET29DeIZRUR8hw,577
66
66
  parsl/executors/base.py,sha256=Qlc7Qa-jbfGpQcGB29JUFXCdhcSN63bjGubEcbDk270,4948
67
67
  parsl/executors/errors.py,sha256=ZxL3nK5samPos8Xixo_jpRtPIiRJfZ5D397_qaXj2g0,2515
68
- parsl/executors/execute_task.py,sha256=PtqHxk778UQaNah1AN-TJV5emZbOcU5TGtWDxFn3_F4,1079
68
+ parsl/executors/execute_task.py,sha256=Kx6V4Qe_Y2mtiKiUYAlGFseceKgzBdoXfuVsOouk2U4,892
69
69
  parsl/executors/globus_compute.py,sha256=p59iBrv2BvYUAZ3YZSpOrm_Wpai592ueiJm3zFS7gvY,5304
70
70
  parsl/executors/status_handling.py,sha256=aRlp0zNrkoaEQEcVoSsk6YNazzHtw0mPYy0GIaEh3qw,15744
71
71
  parsl/executors/threads.py,sha256=lX9VuaMDBg_dqAObKfeaZlYCY4-ti33U-YMWOhWFGTY,4141
72
72
  parsl/executors/flux/__init__.py,sha256=P9grTTeRPXfqXurFhlSS7XhmE6tTbnCnyQ1f9b-oYHE,136
73
73
  parsl/executors/flux/execute_parsl_task.py,sha256=zHP5M7ILGiwnoalZ8WsfVVdZM7uP4iQo2ThVh4crxpM,1530
74
- parsl/executors/flux/executor.py,sha256=NLdjOli5VjrSdEfyWbfqKN_8APvFkp_qFCouS_9NeLQ,17069
74
+ parsl/executors/flux/executor.py,sha256=UhW8R_QVYIuafrX4xOIokzl1z7p4KjFBUzser3bAxOg,16981
75
75
  parsl/executors/flux/flux_instance_manager.py,sha256=5T3Rp7ZM-mlT0Pf0Gxgs5_YmnaPrSF9ec7zvRfLfYJw,2129
76
76
  parsl/executors/high_throughput/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
77
  parsl/executors/high_throughput/errors.py,sha256=k2XuvvFdUfNs2foHFnxmS-BToRMfdXpYEa4EF3ELKq4,1554
78
- parsl/executors/high_throughput/executor.py,sha256=oZGqdbtDy-lDOvV4CgdoFrtukmphRh5tVt31esJdh10,39911
79
- parsl/executors/high_throughput/interchange.py,sha256=3NTPVpraYiEcT_wct4jwXIaU8xgBlW5krQag4dnVNCM,25653
78
+ parsl/executors/high_throughput/executor.py,sha256=fAjGPJM4_EQbIosIvNpXzKWTLqGVDNWB635l-6hkBow,40240
79
+ parsl/executors/high_throughput/interchange.py,sha256=PcalTRzNRVW5B5B6CVR4IoGqqrdhOSzzIcHoQawRH3A,26089
80
80
  parsl/executors/high_throughput/manager_record.py,sha256=ZMsqFxvreGLRXAw3N-JnODDa9Qfizw2tMmcBhm4lco4,490
81
81
  parsl/executors/high_throughput/manager_selector.py,sha256=UKcUE6v0tO7PDMTThpKSKxVpOpOUilxDL7UbNgpZCxo,2116
82
82
  parsl/executors/high_throughput/monitoring_info.py,sha256=HC0drp6nlXQpAop5PTUKNjdXMgtZVvrBL0JzZJebPP4,298
83
83
  parsl/executors/high_throughput/mpi_executor.py,sha256=P8n81Y9t5cw-YuNFgkrGtc4oG75ntBJDonUIfhkp_5I,5223
84
84
  parsl/executors/high_throughput/mpi_prefix_composer.py,sha256=DmpKugANNa1bdYlqQBLHkrFc15fJpefPPhW9hkAlh1s,4308
85
- parsl/executors/high_throughput/mpi_resource_management.py,sha256=73bTW2ZbHRfcrPN318cyjiqDN50AM1cOCQqUGJDIlBg,8199
85
+ parsl/executors/high_throughput/mpi_resource_management.py,sha256=SeFtvvS-8asTGaukM5YW85m_8FdIGod0I5Vi0fNcXZg,7796
86
86
  parsl/executors/high_throughput/probe.py,sha256=QlBFwSSxMmtH-Aa2JEvCzQLddsbWZluMUxq5ypLR51E,3831
87
- parsl/executors/high_throughput/process_worker_pool.py,sha256=v-YesFPRU4-Zctyf-N8Tb9YCEqmDNNUaW66YsGsQcxo,40538
88
- parsl/executors/high_throughput/zmq_pipes.py,sha256=NUK25IEh0UkxzdqQQyM8tMtuZmjSiTeWu1DzkkAIOhA,8980
87
+ parsl/executors/high_throughput/process_worker_pool.py,sha256=KLNE4kswtV0OzoHWCgg00Bs8zPtWixJGBqAbDPPfrWY,40688
88
+ parsl/executors/high_throughput/zmq_pipes.py,sha256=fANpmyvBetp0_b-qsI59yqBW8ank-PDNqThuQ3JeVl4,8183
89
89
  parsl/executors/radical/__init__.py,sha256=CKbtV2numw5QvgIBq1htMUrt9TqDCIC2zifyf2svTNU,186
90
- parsl/executors/radical/executor.py,sha256=e3XS4mvug1uJ6wrt4UH6hBgfbDbc-mQH3xUW2ZmBsMQ,22888
90
+ parsl/executors/radical/executor.py,sha256=eb7zgakpFBvGVlQ2NgxQlfjaql_mQQrYqqJJqbFxEno,22643
91
91
  parsl/executors/radical/rpex_resources.py,sha256=Q7-0u3K447LBCe2y7mVcdw6jqWI7SdPXxCKhkr6FoRQ,5139
92
- parsl/executors/radical/rpex_worker.py,sha256=z6r82ZujKb6sdKIdHsQ_5EBMDIQieeGcrlt6kGLFo4M,1830
92
+ parsl/executors/radical/rpex_worker.py,sha256=vl807EucEH4YgKgQ-OAP1cZPDqRwKjte3WxH2CERbo8,1796
93
93
  parsl/executors/taskvine/__init__.py,sha256=9rwp3M8B0YyEhZMLO0RHaNw7u1nc01WHbXLqnBTanu0,293
94
94
  parsl/executors/taskvine/errors.py,sha256=euIYkSslrNSI85kyi2s0xzOaO9ik4c1fYHstMIeiBJk,652
95
95
  parsl/executors/taskvine/exec_parsl_function.py,sha256=ftGdJU78lKPPkphSHlEi4rj164mhuMHJjghVqfgeXKk,7085
@@ -119,7 +119,7 @@ parsl/monitoring/__init__.py,sha256=0ywNz6i0lM1xo_7_BIxhETDGeVd2C_0wwD7qgeaMR4c,
119
119
  parsl/monitoring/db_manager.py,sha256=VZrDS2xr6HaYxLN9ueLbFJiWucrzjOyIc75tf8FeJ9c,33207
120
120
  parsl/monitoring/errors.py,sha256=VQNIMoo5Ro8GlJ-Ad-6q-YA0y6sTc-IibSdNXZC-GuU,306
121
121
  parsl/monitoring/message_type.py,sha256=Khn88afNxcOIciKiCK4GLnn90I5BlRTiOL3zK-P07yQ,401
122
- parsl/monitoring/monitoring.py,sha256=oIXwI_oxan-b1XdTneoza--4uTqYF6ar2X4zWgarGVQ,6602
122
+ parsl/monitoring/monitoring.py,sha256=-kr4cq1AGiXHHfi0XUJ-NPk0D_rz-fS-T-PD8DHt7Wo,6602
123
123
  parsl/monitoring/remote.py,sha256=Kki5sTnZwHUIFMJh99w11vQrKxiHGO7ElBydwAIctbY,12636
124
124
  parsl/monitoring/types.py,sha256=oOCrzv-ab-_rv4pb8o58Sdb8G_RGp1aZriRbdf9zBEk,339
125
125
  parsl/monitoring/queries/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -190,19 +190,18 @@ parsl/providers/slurm/template.py,sha256=KpgBEFMc1ps-38jdrk13xUGx9TCivu-iF90jgQD
190
190
  parsl/providers/torque/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
191
191
  parsl/providers/torque/template.py,sha256=4qfc2gmlEhRCAD7erFDOs4prJQ43I8s4E8DSUSVQx3A,358
192
192
  parsl/providers/torque/torque.py,sha256=QMmhJtCfrF7HQW4rJWAZ6PaQ3WWFVWJS0QSkFH0wwdo,8918
193
- parsl/serialize/__init__.py,sha256=-tQNsFsHTfWxZL6iydt08S9t8QP2rk9Q6RKnXYwbkfY,406
193
+ parsl/serialize/__init__.py,sha256=mD67d2zn0VgOxyNR3xuPnq6Go8UZ_XPIsC1hu3qDfos,226
194
194
  parsl/serialize/base.py,sha256=5GyJRr3PQohp5Zv9YQUEyes61mfUK7wTctTaXITYpSQ,1082
195
195
  parsl/serialize/concretes.py,sha256=JPWmltkm-XH2S22ugXCYWYmxwukCUEXWYKzPkKXJO60,1911
196
196
  parsl/serialize/errors.py,sha256=TmTjGI4jf8p2hH454jpp_CPbhxwPXcj5MdOMEmF6so4,1066
197
- parsl/serialize/facade.py,sha256=3uOuVp0epfyLn7qDzuWqLfsy971YVGD3sqwqcAiRwh0,6687
197
+ parsl/serialize/facade.py,sha256=D33Sia7rnJ2_ZdSBPsWBa0XDWVHOwqMe0DO4_sdXsoY,5596
198
198
  parsl/serialize/proxystore.py,sha256=o-ha9QAvVhbN8y9S1itk3W0O75eyHYZw2AvB2xu5_Lg,1624
199
199
  parsl/tests/__init__.py,sha256=VTtJzOzz_x6fWNh8IOnsgFqVbdiJShi2AZH21mcmID4,204
200
200
  parsl/tests/callables_helper.py,sha256=ceP1YYsNtrZgKT6MAIvpgdccEjQ_CpFEOnZBGHKGOx0,30
201
201
  parsl/tests/conftest.py,sha256=PqXpj1AxpPQrcKXJBQ83WIF8TIzZ4-YhAjKQPahE1Tw,15618
202
- parsl/tests/test_aalst_patterns.py,sha256=lNIxb7nIgh1yX7hR2fr_ck_mxYJxx8ASKK9zHUVqPno,9614
203
202
  parsl/tests/test_callables.py,sha256=97vrIF1_hfDGd81FM1bhR6FemZMWFcALrH6pVHMTCt8,1974
204
- parsl/tests/test_curvezmq.py,sha256=yyhlS4vmaZdMitiySoy4l_ih9H1bsPiN-tMdwIh3H20,12431
205
- parsl/tests/test_execute_task.py,sha256=lVZEcRocBTQHOQNEp8Gq858lQiYsTb6uI2jNxEUVog8,816
203
+ parsl/tests/test_curvezmq.py,sha256=CmLQforq2WPYFC5OsOGh5a9ujiEFKygktZi1mpOn3XU,11239
204
+ parsl/tests/test_execute_task.py,sha256=IzvuDLLckrRzghjvvcsUTNXFKskNsNQeKy1Bx-NWf2k,457
206
205
  parsl/tests/test_flux.py,sha256=TxkVPjksl1usdE9Y6y2FYhdOOmYFTlbEv_V9WnvF41A,5098
207
206
  parsl/tests/test_summary.py,sha256=x1RfWCFLzHjBw2ukwoRZPW1LFCKiwDmxx86ES-6yGRA,552
208
207
  parsl/tests/test_thread_parallelism.py,sha256=TVNeQ1NkUhaf3YbbzUSH-ozFFdX_GbX-5ygommjVxvc,1653
@@ -258,8 +257,6 @@ parsl/tests/manual_tests/test_regression_220.py,sha256=Jo2puWt1W0r1rJfaJFgd2ZPgR
258
257
  parsl/tests/manual_tests/test_worker_count.py,sha256=Cv8nAWMXAREiiGEBUr_8JyI87ffp8JGAyDqVXzcjX_0,2072
259
258
  parsl/tests/site_tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
260
259
  parsl/tests/site_tests/site_config_selector.py,sha256=cpToBNdvHZPOxYfiFpGVuydSMlmxfeo27N3VEjRFLgw,1815
261
- parsl/tests/site_tests/test_provider.py,sha256=o9pUn_qzQnUSnuh-OQGBec_dNrmOVTD79-i27p_K-N8,2696
262
- parsl/tests/site_tests/test_site.py,sha256=kykFelM7Z78EF0rmS2NRaN-qhXBE9vaSflUGtps-h60,1946
263
260
  parsl/tests/sites/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
264
261
  parsl/tests/sites/test_affinity.py,sha256=CCfYxSkpoznREGV2-K2As4YbsMY7bCiYqRMZkUp-zO0,1500
265
262
  parsl/tests/sites/test_concurrent.py,sha256=ybHOnIsRyYs2tFPggv2ivRVoqH8Ts4PTEvb4IN3Obv8,1219
@@ -295,12 +292,10 @@ parsl/tests/test_docs/test_from_slides.py,sha256=KcULKUfmKEkSMzSL1HcyEhAF_OoDScu
295
292
  parsl/tests/test_docs/test_kwargs.py,sha256=A8kmPIGoM0E9mN8TcAeA93UbX62etEk6p3I18N5nLpk,963
296
293
  parsl/tests/test_docs/test_tutorial_1.py,sha256=2k_owiw39HJcm1i3YGYna9cNnMS0hpnFbEEdhP2xpxU,1437
297
294
  parsl/tests/test_docs/test_workflow1.py,sha256=UrU9axV_cXqhD2GEQ_riJ34icJyNxqJ28eVT2BpG8kQ,976
298
- parsl/tests/test_docs/test_workflow2.py,sha256=qeI789Qr9qtSG1DGhyt-Y_3KUcPltQfIyQVeZ73DeX4,1149
299
295
  parsl/tests/test_docs/test_workflow4.py,sha256=PfOVDx5v_NtwDvg-ccC3A3SVM-SF0Pcybx2c7BF9Jdw,1159
300
296
  parsl/tests/test_error_handling/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
301
297
  parsl/tests/test_error_handling/test_fail.py,sha256=xx4TGWfL7le4cQ9nvnUkrlmKQJkskhD0l_3W1xwZSEI,282
302
298
  parsl/tests/test_error_handling/test_python_walltime.py,sha256=rdmGZHIkuann2Njt3i62odKJ0FaODGr7-L96rOXNVYg,950
303
- parsl/tests/test_error_handling/test_rand_fail.py,sha256=crFg4GmwdDpvx49_7w5Xt2P7H2R_V9f6i1Ar-QkASuU,3864
304
299
  parsl/tests/test_error_handling/test_resource_spec.py,sha256=dyuzMkS3M_BmZUbu1mF7yojwkJehDbdFvphNlYwU9yM,1458
305
300
  parsl/tests/test_error_handling/test_retries.py,sha256=zJ9D2hrvXQURnK2OIf5LfQFcSDVZ8rhdpp6peGccY7s,2372
306
301
  parsl/tests/test_error_handling/test_retry_handler.py,sha256=8fMHffMBLhRyNreIqkrwamx9TYRZ498uVYNlkcbAoLU,1407
@@ -312,22 +307,23 @@ parsl/tests/test_htex/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
312
307
  parsl/tests/test_htex/test_basic.py,sha256=OCX4hbXLqxRakjt_pB9F68qJJv8qGOTkpiIzjHkSq1k,451
313
308
  parsl/tests/test_htex/test_block_manager_selector_unit.py,sha256=BeSj8jDeBHUEJVMVXwf0KLBhZ_pnsBEkG4vacldBfEY,737
314
309
  parsl/tests/test_htex/test_command_client_timeout.py,sha256=5tBViUhPT1ejnDDztTcEA690aA2BUxnPY0FpMf-1AXE,2008
310
+ parsl/tests/test_htex/test_command_concurrency_regression_1321.py,sha256=_Bx7vRKOwyVEnJMnV7eHa1XjNWECWPohGY6eE2tQ9Tk,1251
315
311
  parsl/tests/test_htex/test_connected_blocks.py,sha256=gaXZSr__pIaLvKY6rF-4r1p_4dO5V28gtxHLT-psEFg,1640
316
312
  parsl/tests/test_htex/test_cpu_affinity_explicit.py,sha256=DVHrRCskDbJIrfB5YSi3ZSbfR4WzijA46aZfZzjNcrU,1382
317
313
  parsl/tests/test_htex/test_disconnected_blocks.py,sha256=3V1Ol9gMS6knjLTgIjB5GrunRSp4ANsJ_2vAvpyMR6c,1858
318
314
  parsl/tests/test_htex/test_disconnected_blocks_failing_provider.py,sha256=eOdipRpKMOkWAXB3UtY1UjqTiwfNs_csNLve8vllG_M,2040
319
315
  parsl/tests/test_htex/test_drain.py,sha256=gYA7qzbv5ozox3clVdW0rlxAzwa_f_P0kqsAez3tIfk,2370
320
316
  parsl/tests/test_htex/test_htex.py,sha256=J1uEGezic8ziPPZsQwfK9iNiTJ53NqXMhIg9CUunjZw,4901
321
- parsl/tests/test_htex/test_interchange_exit_bad_registration.py,sha256=fQGNp5jX1m6cQAT1gr519GLMxviYtG-Fs43ru9Yyoec,4485
317
+ parsl/tests/test_htex/test_interchange_exit_bad_registration.py,sha256=VWe-kj7kyvQcdUiAh3b2cZn8KWwHWIpel7bVa4XwlP0,4544
322
318
  parsl/tests/test_htex/test_manager_failure.py,sha256=N-obuSZ8f7XA_XcddoN2LWKSVtpKUZvTHb7BFelS3iQ,1143
323
319
  parsl/tests/test_htex/test_manager_selector_by_block.py,sha256=VQqSE6MDhGpDSjShGUTbj7l9Ahuj2tC9qD--o4puF44,1310
324
320
  parsl/tests/test_htex/test_managers_command.py,sha256=SCwkfyGB-Udgu5L2yDMpR5bsaT-aNjNkiXxtuRb25DI,1622
325
321
  parsl/tests/test_htex/test_missing_worker.py,sha256=gyp5i7_t-JHyJGtz_eXZKKBY5w8oqLOIxO6cJgGJMtQ,745
326
322
  parsl/tests/test_htex/test_multiple_disconnected_blocks.py,sha256=2vXZoIx4NuAWYuiNoL5Gxr85w72qZ7Kdb3JGh0FufTg,1867
327
- parsl/tests/test_htex/test_priority_queue.py,sha256=vH58WwDZVpyIiMqhjwGkme7Cv5-jupTmM52EOcbdrEg,2106
323
+ parsl/tests/test_htex/test_priority_queue.py,sha256=sAs9W4I0LsmvPpuN9Q66yRY4zoSOEo0eMFh6DXlih0I,2336
328
324
  parsl/tests/test_htex/test_resource_spec_validation.py,sha256=ZXW02jDd1rNxjBLh1jHyiz31zNoB9JzDw94aWllXFd4,1102
329
325
  parsl/tests/test_htex/test_worker_failure.py,sha256=Uz-RHI-LK78FMjXUvrUFmo4iYfmpDVBUcBxxRb3UG9M,603
330
- parsl/tests/test_htex/test_zmq_binding.py,sha256=RaUK6Pmvg8v2vqXg3fFj-k2bQ8Cbuxh6dprsq2WSA98,4339
326
+ parsl/tests/test_htex/test_zmq_binding.py,sha256=SmX_63vvXKnzWISBr8HnJCrRqubx7K0blvgjq4Px2gc,4391
331
327
  parsl/tests/test_monitoring/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
332
328
  parsl/tests/test_monitoring/test_app_names.py,sha256=A-mOMCVhZDnUyJp32fsTUkHdcyval8o7WPEWacDkbD4,2208
333
329
  parsl/tests/test_monitoring/test_basic.py,sha256=qyKKzjmoYwQC485Xk4QHqU3FvVILpuIjnJThMOl7pq4,6316
@@ -347,7 +343,7 @@ parsl/tests/test_mpi_apps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJW
347
343
  parsl/tests/test_mpi_apps/test_bad_mpi_config.py,sha256=QKvEUSrHIBrvqu2fRj1MAqxsYxDfcrdQ7dzWdOZejuU,1320
348
344
  parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py,sha256=_fpiaDq9yEUuBxTiuxLFsBt5r1oX9S-3S-YL5yRB13E,5423
349
345
  parsl/tests/test_mpi_apps/test_mpi_prefix.py,sha256=yJslZvYK3JeL9UgxMwF9DDPR9QD4zJLGVjubD0F-utc,1950
350
- parsl/tests/test_mpi_apps/test_mpi_scheduler.py,sha256=LPvk5wywYANQNCoQ8muwOLEznnZqwler4jJglinAT9I,7370
346
+ parsl/tests/test_mpi_apps/test_mpi_scheduler.py,sha256=3LEPPYzZEPCYFiqv1YJIRJwiVmZHIplu8P-czUJ6N5U,5550
351
347
  parsl/tests/test_mpi_apps/test_mpiex.py,sha256=mlFdHK3A1B6NsEhxTQQX8lhs9qVza36FMG99vNrBRW4,2021
352
348
  parsl/tests/test_mpi_apps/test_resource_spec.py,sha256=5k6HM2jtb6sa7jetpI-Tl1nPQiN33VLaM7YT10c307E,3756
353
349
  parsl/tests/test_providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -399,7 +395,6 @@ parsl/tests/test_regression/test_221.py,sha256=jOS0EVu_2sbh10eg5hnivPvhNt0my_50v
399
395
  parsl/tests/test_regression/test_226.py,sha256=tVqGAU99RRQqz9KuMgeLVoddot2pRqG2y4daW44RrlE,1110
400
396
  parsl/tests/test_regression/test_2652.py,sha256=R_ZoX7Vgz4H2ionhjm_KWFW-vWt_MlgWV_zdTsT68M0,848
401
397
  parsl/tests/test_regression/test_69a.py,sha256=sRkMT95b7WvFAK1hUy7eNwKnzFNqaX9qESdNmoh0rAo,1902
402
- parsl/tests/test_regression/test_854.py,sha256=acFLEciwL0_ZHq6lBtFHRMTEHaPpAf3L4q4_f1LnAAU,1884
403
398
  parsl/tests/test_regression/test_97_parallelism_0.py,sha256=Fe58KFhQpZuU982IP9ZSpKBb_Jpftv9pJjH73f8_ec8,1592
404
399
  parsl/tests/test_regression/test_98.py,sha256=E7dituuonKN5uWocZkJYZlaE5x5rDM4MZlv2PloAKzY,452
405
400
  parsl/tests/test_scaling/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -417,7 +412,6 @@ parsl/tests/test_serialization/test_2555_caching_deserializer.py,sha256=jEXJvbri
417
412
  parsl/tests/test_serialization/test_3495_deserialize_managerlost.py,sha256=GoMtK6BmARicawzYR2eQj5jUSL9RZ_tHV3g19BdQuQ8,1144
418
413
  parsl/tests/test_serialization/test_basic.py,sha256=4_1Rkq5tNl9EC0nfneF8kHTws7I0E6ovE_0DE97BEfU,544
419
414
  parsl/tests/test_serialization/test_htex_code_cache.py,sha256=dd0XwlNDn6Lgj6-nHHjYWzl1FnhFLY_8Buxj77dyZ28,1840
420
- parsl/tests/test_serialization/test_pack_resource_spec.py,sha256=-Vtyh8KyezZw8e7M2Z4m3LawY1Au4U-H3KRmVKXSut0,641
421
415
  parsl/tests/test_serialization/test_proxystore_configured.py,sha256=lGWOSEWul16enDWhW-s7CK0d3eMDzm1324Fmj0cZMVU,2293
422
416
  parsl/tests/test_serialization/test_proxystore_impl.py,sha256=uGd45sfPm9rJhzqKV0rI3lqdSOAUddQf-diEpcJAlcY,1228
423
417
  parsl/tests/test_shutdown/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -457,13 +451,13 @@ parsl/usage_tracking/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
457
451
  parsl/usage_tracking/api.py,sha256=iaCY58Dc5J4UM7_dJzEEs871P1p1HdxBMtNGyVdzc9g,1821
458
452
  parsl/usage_tracking/levels.py,sha256=xbfzYEsd55KiZJ-mzNgPebvOH4rRHum04hROzEf41tU,291
459
453
  parsl/usage_tracking/usage.py,sha256=hbMo5BYgIWqMcFWqN-HYP1TbwNrTonpv-usfwnCFJKY,9212
460
- parsl-2025.9.8.data/scripts/exec_parsl_function.py,sha256=YXKVVIa4zXmOtz-0Ca4E_5nQfN_3S2bh2tB75uZZB4w,7774
461
- parsl-2025.9.8.data/scripts/interchange.py,sha256=f1sCXmH7B7vhhBZbVJ44kbC6FtM3bH7vpKoYBvxgo1A,25640
462
- parsl-2025.9.8.data/scripts/parsl_coprocess.py,sha256=zrVjEqQvFOHxsLufPi00xzMONagjVwLZbavPM7bbjK4,5722
463
- parsl-2025.9.8.data/scripts/process_worker_pool.py,sha256=-5VLVjeab6oROulx7OwI9tdNNHd6uap45I1jltm-UDc,40524
464
- parsl-2025.9.8.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
465
- parsl-2025.9.8.dist-info/METADATA,sha256=mPH_XO9WhfJ-yqGBbzAI_3kj6diHJKX-jtTq-iJ2zrQ,4054
466
- parsl-2025.9.8.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
467
- parsl-2025.9.8.dist-info/entry_points.txt,sha256=XqnsWDYoEcLbsMcpnYGKLEnSBmaIe1YoM5YsBdJG2tI,176
468
- parsl-2025.9.8.dist-info/top_level.txt,sha256=PIheYoUFQtF2icLsgOykgU-Cjuwr2Oi6On2jo5RYgRM,6
469
- parsl-2025.9.8.dist-info/RECORD,,
454
+ parsl-2025.9.22.data/scripts/exec_parsl_function.py,sha256=YXKVVIa4zXmOtz-0Ca4E_5nQfN_3S2bh2tB75uZZB4w,7774
455
+ parsl-2025.9.22.data/scripts/interchange.py,sha256=5hLSdQNG65v0iSx2FSeS6uyp7i3Ez2qWIzNSVblSixI,26076
456
+ parsl-2025.9.22.data/scripts/parsl_coprocess.py,sha256=zrVjEqQvFOHxsLufPi00xzMONagjVwLZbavPM7bbjK4,5722
457
+ parsl-2025.9.22.data/scripts/process_worker_pool.py,sha256=WGR9yr8EfBptQ6X-CvAPQEo1rlljD6peCc-za36-1xM,40674
458
+ parsl-2025.9.22.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
459
+ parsl-2025.9.22.dist-info/METADATA,sha256=IpHlJRMpOyOsgV7Ig9GQssk2IETO6cSZWaqEifE29c0,4055
460
+ parsl-2025.9.22.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
461
+ parsl-2025.9.22.dist-info/entry_points.txt,sha256=XqnsWDYoEcLbsMcpnYGKLEnSBmaIe1YoM5YsBdJG2tI,176
462
+ parsl-2025.9.22.dist-info/top_level.txt,sha256=PIheYoUFQtF2icLsgOykgU-Cjuwr2Oi6On2jo5RYgRM,6
463
+ parsl-2025.9.22.dist-info/RECORD,,
@@ -1,88 +0,0 @@
1
- import argparse
2
- import logging
3
- import time
4
-
5
- import pytest
6
-
7
- import parsl
8
- from parsl.app.app import python_app # , bash_app
9
- from parsl.jobs.states import JobState
10
- from parsl.tests.site_tests.site_config_selector import fresh_config
11
-
12
- logger = logging.getLogger(__name__)
13
-
14
-
15
- @python_app
16
- def platform(sleep=10, stdout=None):
17
- import time
18
- time.sleep(sleep)
19
- return True
20
-
21
-
22
- @pytest.mark.local
23
- @pytest.mark.skip("This test cannot run on sites which cannot be identified by site_config_selector")
24
- def test_provider():
25
- """ Provider scaling
26
- """
27
- logger.info("Starting test_provider")
28
- config = fresh_config()
29
- name = config.executors[0].label
30
- parsl.load(config)
31
-
32
- dfk = parsl.dfk()
33
- logger.info("Trying to get executor : {}".format(name))
34
-
35
- x = platform(sleep=0)
36
- logger.info("Result is {}".format(x.result()))
37
-
38
- executor = dfk.executors[name]
39
- provider = dfk.executors[name].provider
40
-
41
- # At this point we should have 1 job
42
- _, current_jobs = executor._get_block_and_job_ids()
43
- assert len(current_jobs) == 1, "Expected 1 job at init, got {}".format(len(current_jobs))
44
-
45
- logger.info("Getting provider status (1)")
46
- status = provider.status(current_jobs)
47
- logger.info("Got provider status")
48
- assert status[0].state == JobState.RUNNING, "Expected job to be in state RUNNING"
49
-
50
- # Scale down to 0
51
- scale_in_blocks = executor.scale_in(blocks=1)
52
- logger.info("Now sleeping 60 seconds")
53
- time.sleep(60)
54
- logger.info("Sleep finished")
55
- logger.info("Getting provider status (2)")
56
- status = executor.status()
57
- logger.info("Got executor status")
58
- logger.info("Block status: {}".format(status))
59
- assert status[scale_in_blocks[0]].terminal is True, "Terminal state"
60
- logger.info("Job in terminal state")
61
-
62
- _, current_jobs = executor._get_block_and_job_ids()
63
- # PR 1952 stoped removing scale_in blocks from self.blocks_to_job_id
64
- # A new PR will handle removing blocks from self.block
65
- # this includes failed/completed/canceled blocks
66
- assert len(current_jobs) == 1, "Expected current_jobs == 1"
67
- dfk.cleanup()
68
- parsl.clear()
69
- logger.info("Ended test_provider")
70
- return True
71
-
72
-
73
- if __name__ == '__main__':
74
-
75
- parser = argparse.ArgumentParser()
76
- parser.add_argument("-c", "--count", default="4",
77
- help="Count of apps to launch")
78
- parser.add_argument("-t", "--time", default="60",
79
- help="Sleep time for each app")
80
-
81
- parser.add_argument("-d", "--debug", action='store_true',
82
- help="Count of apps to launch")
83
- args = parser.parse_args()
84
-
85
- if args.debug:
86
- parsl.set_stream_logger()
87
-
88
- x = test_provider()
@@ -1,70 +0,0 @@
1
- import argparse
2
-
3
- import pytest
4
-
5
- import parsl
6
- from parsl.app.app import python_app
7
- from parsl.tests.site_tests.site_config_selector import fresh_config
8
-
9
-
10
- @python_app
11
- def platform(sleep=10, stdout=None):
12
- import platform
13
- import time
14
- time.sleep(sleep)
15
- return platform.uname()
16
-
17
-
18
- @pytest.mark.local
19
- @pytest.mark.skip("The behaviour this test is testing is unclear: there is no guarantee that tasks will go to different nodes")
20
- def test_platform(n=2, sleep_dur=10):
21
- """ This should sleep to make sure that concurrent apps will go to different workers
22
- on different nodes.
23
- """
24
- config = fresh_config()
25
- if config.executors[0].label == "htex_local":
26
- return
27
-
28
- parsl.load(fresh_config())
29
-
30
- dfk = parsl.dfk()
31
- name = list(dfk.executors.keys())[0]
32
- print("Trying to get executor : ", name)
33
-
34
- x = [platform(sleep=1) for i in range(2)]
35
- print([i.result() for i in x])
36
-
37
- print("Executor : ", dfk.executors[name])
38
- print("Connected : ", dfk.executors[name].connected_workers())
39
- print("Outstanding : ", dfk.executors[name].outstanding())
40
-
41
- d = []
42
- for i in range(0, n):
43
- x = platform(sleep=sleep_dur)
44
- d.append(x)
45
-
46
- pinfo = set([i.result()for i in d])
47
- assert len(pinfo) == 2, "Expected two nodes, instead got {}".format(pinfo)
48
-
49
- print("Test passed")
50
-
51
- dfk.cleanup()
52
- parsl.clear()
53
- return True
54
-
55
-
56
- if __name__ == '__main__':
57
-
58
- parser = argparse.ArgumentParser()
59
- parser.add_argument("-c", "--count", default="4",
60
- help="Count of apps to launch")
61
- parser.add_argument("-t", "--time", default="60",
62
- help="Sleep time for each app")
63
- parser.add_argument("-d", "--debug", action='store_true',
64
- help="Count of apps to launch")
65
- args = parser.parse_args()
66
-
67
- if args.debug:
68
- parsl.set_stream_logger()
69
-
70
- x = test_platform(n=int(args.count), sleep_dur=int(args.time))