parsl 2025.9.8__py3-none-any.whl → 2025.9.15__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 (28) hide show
  1. parsl/curvezmq.py +0 -16
  2. parsl/executors/high_throughput/executor.py +8 -0
  3. parsl/executors/high_throughput/interchange.py +10 -1
  4. parsl/executors/high_throughput/zmq_pipes.py +29 -43
  5. parsl/monitoring/monitoring.py +2 -2
  6. parsl/multiprocessing.py +0 -49
  7. parsl/tests/test_curvezmq.py +0 -42
  8. parsl/tests/test_htex/test_command_concurrency_regression_1321.py +54 -0
  9. parsl/tests/test_htex/test_interchange_exit_bad_registration.py +2 -1
  10. parsl/tests/test_htex/test_priority_queue.py +1 -0
  11. parsl/tests/test_htex/test_zmq_binding.py +2 -1
  12. parsl/version.py +1 -1
  13. {parsl-2025.9.8.data → parsl-2025.9.15.data}/scripts/interchange.py +10 -1
  14. {parsl-2025.9.8.dist-info → parsl-2025.9.15.dist-info}/METADATA +2 -2
  15. {parsl-2025.9.8.dist-info → parsl-2025.9.15.dist-info}/RECORD +22 -27
  16. parsl/tests/site_tests/test_provider.py +0 -88
  17. parsl/tests/site_tests/test_site.py +0 -70
  18. parsl/tests/test_aalst_patterns.py +0 -474
  19. parsl/tests/test_docs/test_workflow2.py +0 -42
  20. parsl/tests/test_error_handling/test_rand_fail.py +0 -171
  21. parsl/tests/test_regression/test_854.py +0 -62
  22. {parsl-2025.9.8.data → parsl-2025.9.15.data}/scripts/exec_parsl_function.py +0 -0
  23. {parsl-2025.9.8.data → parsl-2025.9.15.data}/scripts/parsl_coprocess.py +0 -0
  24. {parsl-2025.9.8.data → parsl-2025.9.15.data}/scripts/process_worker_pool.py +0 -0
  25. {parsl-2025.9.8.dist-info → parsl-2025.9.15.dist-info}/LICENSE +0 -0
  26. {parsl-2025.9.8.dist-info → parsl-2025.9.15.dist-info}/WHEEL +0 -0
  27. {parsl-2025.9.8.dist-info → parsl-2025.9.15.dist-info}/entry_points.txt +0 -0
  28. {parsl-2025.9.8.dist-info → parsl-2025.9.15.dist-info}/top_level.txt +0 -0
parsl/curvezmq.py CHANGED
@@ -101,17 +101,6 @@ class BaseContext(metaclass=ABCMeta):
101
101
  """
102
102
  self._ctx.destroy(linger)
103
103
 
104
- def recreate(self, linger: Optional[int] = None):
105
- """Destroy then recreate the context.
106
-
107
- Parameters
108
- ----------
109
- linger : int, optional
110
- If specified, set LINGER on sockets prior to closing them.
111
- """
112
- self.destroy(linger)
113
- self._ctx = zmq.Context()
114
-
115
104
 
116
105
  class ServerContext(BaseContext):
117
106
  """CurveZMQ server context
@@ -175,11 +164,6 @@ class ServerContext(BaseContext):
175
164
  self.auth_thread.stop()
176
165
  super().destroy(linger)
177
166
 
178
- def recreate(self, linger: Optional[int] = None):
179
- super().recreate(linger)
180
- if self.auth_thread:
181
- self.auth_thread = self._start_auth_thread()
182
-
183
167
 
184
168
  class ClientContext(BaseContext):
185
169
  """CurveZMQ client context
@@ -332,6 +332,13 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
332
332
  self.encrypted = encrypted
333
333
  self.cert_dir = None
334
334
 
335
+ # This flag will enable/disable internal Python mismatch checks
336
+ # between the interchange and worker managers. This serves as a
337
+ # temporary workaround for Globus Compute to support different
338
+ # Python versions at the endpoint and worker layers. We can drop
339
+ # the flag once we implement modular internal message protocols.
340
+ self._check_python_mismatch: bool = True
341
+
335
342
  if not launch_cmd:
336
343
  launch_cmd = DEFAULT_LAUNCH_CMD
337
344
  self.launch_cmd = launch_cmd
@@ -568,6 +575,7 @@ class HighThroughputExecutor(BlockProviderExecutor, RepresentationMixin, UsageIn
568
575
  "cert_dir": self.cert_dir,
569
576
  "manager_selector": self.manager_selector,
570
577
  "run_id": self.run_id,
578
+ "_check_python_mismatch": self._check_python_mismatch,
571
579
  }
572
580
 
573
581
  config_pickle = pickle.dumps(interchange_config)
@@ -56,6 +56,7 @@ class Interchange:
56
56
  cert_dir: Optional[str],
57
57
  manager_selector: ManagerSelector,
58
58
  run_id: str,
59
+ _check_python_mismatch: bool,
59
60
  ) -> None:
60
61
  """
61
62
  Parameters
@@ -99,6 +100,11 @@ class Interchange:
99
100
 
100
101
  cert_dir : str | None
101
102
  Path to the certificate directory.
103
+
104
+ _check_python_mismatch : bool
105
+ If True, the interchange and worker managers must run the same version of
106
+ Python. Running different versions can cause inter-process communication
107
+ errors, so proceed with caution.
102
108
  """
103
109
  self.cert_dir = cert_dir
104
110
  self.logdir = logdir
@@ -126,6 +132,7 @@ class Interchange:
126
132
  logger.info("Connected to client")
127
133
 
128
134
  self.run_id = run_id
135
+ self._check_python_mismatch = _check_python_mismatch
129
136
 
130
137
  self.hub_address = hub_address
131
138
  self.hub_zmq_port = hub_zmq_port
@@ -396,7 +403,9 @@ class Interchange:
396
403
  logger.info(f'Registration info for manager {manager_id!r}: {meta}')
397
404
  self._send_monitoring_info(monitoring_radio, new_rec)
398
405
 
399
- if (mgr_minor_py, mgr_parsl_v) != (ix_minor_py, ix_parsl_v):
406
+ python_mismatch: bool = ix_minor_py != mgr_minor_py
407
+ parsl_mismatch: bool = ix_parsl_v != mgr_parsl_v
408
+ if parsl_mismatch or (self._check_python_mismatch and python_mismatch):
400
409
  kill_event.set()
401
410
  vm_exc = VersionMismatch(
402
411
  f"py.v={ix_minor_py} parsl.v={ix_parsl_v}",
@@ -74,51 +74,37 @@ class CommandClient:
74
74
 
75
75
  reply = '__PARSL_ZMQ_PIPES_MAGIC__'
76
76
  with self._lock:
77
- for _ in range(max_retries):
78
- try:
79
- logger.debug("Sending command client command")
80
-
81
- if timeout_s is not None:
82
- remaining_time_s = start_time_s + timeout_s - time.monotonic()
83
- poll_result = self.zmq_socket.poll(timeout=remaining_time_s * 1000, flags=zmq.POLLOUT)
84
- if poll_result == zmq.POLLOUT:
85
- pass # this is OK, so continue
86
- elif poll_result == 0:
87
- raise CommandClientTimeoutError("Waiting for command channel to be ready for a command")
88
- else:
89
- raise InternalConsistencyError(f"ZMQ poll returned unexpected value: {poll_result}")
90
-
91
- self.zmq_socket.send_pyobj(message, copy=True)
92
-
93
- if timeout_s is not None:
94
- logger.debug("Polling for command client response or timeout")
95
- remaining_time_s = start_time_s + timeout_s - time.monotonic()
96
- poll_result = self.zmq_socket.poll(timeout=remaining_time_s * 1000, flags=zmq.POLLIN)
97
- if poll_result == zmq.POLLIN:
98
- pass # this is OK, so continue
99
- elif poll_result == 0:
100
- logger.error("Command timed-out - command client is now bad forever")
101
- self.ok = False
102
- raise CommandClientTimeoutError("Waiting for a reply from command channel")
103
- else:
104
- raise InternalConsistencyError(f"ZMQ poll returned unexpected value: {poll_result}")
105
-
106
- logger.debug("Receiving command client response")
107
- reply = self.zmq_socket.recv_pyobj()
108
- logger.debug("Received command client response")
109
- except zmq.ZMQError:
110
- logger.exception("Potential ZMQ REQ-REP deadlock caught")
111
- logger.info("Trying to reestablish context")
112
- self.zmq_context.recreate()
113
- self.create_socket_and_bind()
77
+ logger.debug("Sending command client command")
78
+
79
+ if timeout_s is not None:
80
+ remaining_time_s = start_time_s + timeout_s - time.monotonic()
81
+ poll_result = self.zmq_socket.poll(timeout=remaining_time_s * 1000, flags=zmq.POLLOUT)
82
+ if poll_result == zmq.POLLOUT:
83
+ pass # this is OK, so continue
84
+ elif poll_result == 0:
85
+ raise CommandClientTimeoutError("Waiting for command channel to be ready for a command")
114
86
  else:
115
- break
116
-
117
- if reply == '__PARSL_ZMQ_PIPES_MAGIC__':
118
- logger.error("Command channel run retries exhausted. Unable to run command")
119
- raise Exception("Command Channel retries exhausted")
87
+ raise InternalConsistencyError(f"ZMQ poll returned unexpected value: {poll_result}")
88
+
89
+ self.zmq_socket.send_pyobj(message, copy=True)
90
+
91
+ if timeout_s is not None:
92
+ logger.debug("Polling for command client response or timeout")
93
+ remaining_time_s = start_time_s + timeout_s - time.monotonic()
94
+ poll_result = self.zmq_socket.poll(timeout=remaining_time_s * 1000, flags=zmq.POLLIN)
95
+ if poll_result == zmq.POLLIN:
96
+ pass # this is OK, so continue
97
+ elif poll_result == 0:
98
+ logger.error("Command timed-out - command client is now bad forever")
99
+ self.ok = False
100
+ raise CommandClientTimeoutError("Waiting for a reply from command channel")
101
+ else:
102
+ raise InternalConsistencyError(f"ZMQ poll returned unexpected value: {poll_result}")
120
103
 
121
- return reply
104
+ logger.debug("Receiving command client response")
105
+ reply = self.zmq_socket.recv_pyobj()
106
+ logger.debug("Received command client response")
107
+ return reply
122
108
 
123
109
  def close(self):
124
110
  self.zmq_socket.close()
@@ -11,9 +11,9 @@ import typeguard
11
11
 
12
12
  from parsl.monitoring.types import TaggedMonitoringMessage
13
13
  from parsl.multiprocessing import (
14
- SizedQueue,
15
14
  SpawnEvent,
16
15
  SpawnProcess,
16
+ SpawnQueue,
17
17
  join_terminate_close_proc,
18
18
  )
19
19
  from parsl.utils import RepresentationMixin
@@ -126,7 +126,7 @@ class MonitoringHub(RepresentationMixin):
126
126
  self.monitoring_hub_active = True
127
127
 
128
128
  self.resource_msgs: Queue[TaggedMonitoringMessage]
129
- self.resource_msgs = SizedQueue()
129
+ self.resource_msgs = SpawnQueue()
130
130
 
131
131
  self.dbm_exit_event: ms.Event
132
132
  self.dbm_exit_event = SpawnEvent()
parsl/multiprocessing.py CHANGED
@@ -4,7 +4,6 @@
4
4
  import logging
5
5
  import multiprocessing
6
6
  import multiprocessing.queues
7
- import platform
8
7
  from multiprocessing.context import ForkProcess as ForkProcessType
9
8
  from multiprocessing.context import SpawnProcess as SpawnProcessType
10
9
  from typing import Callable
@@ -21,54 +20,6 @@ SpawnEvent = SpawnContext.Event
21
20
  SpawnQueue = SpawnContext.Queue
22
21
 
23
22
 
24
- class MacSafeQueue(multiprocessing.queues.Queue):
25
- """ Multiprocessing queues do not have qsize attributes on MacOS.
26
- This is slower but more portable version of the multiprocessing Queue
27
- that adds a explicit counter
28
-
29
- Reference : https://github.com/keras-team/autokeras/commit/4ddd568b06b4045ace777bc0fb7bc18573b85a75
30
- """
31
-
32
- def __init__(self, *args, **kwargs):
33
- if 'ctx' not in kwargs:
34
- kwargs['ctx'] = multiprocessing.get_context('spawn')
35
- super().__init__(*args, **kwargs)
36
- self._counter = multiprocessing.Value('i', 0)
37
-
38
- def put(self, *args, **kwargs):
39
- # logger.critical("Putting item {}".format(args))
40
- x = super().put(*args, **kwargs)
41
- with self._counter.get_lock():
42
- self._counter.value += 1
43
- return x
44
-
45
- def get(self, *args, **kwargs):
46
- x = super().get(*args, **kwargs)
47
- with self._counter.get_lock():
48
- self._counter.value -= 1
49
- # logger.critical("Getting item {}".format(x))
50
- return x
51
-
52
- def qsize(self):
53
- return self._counter.value
54
-
55
- def empty(self):
56
- return not self._counter.value
57
-
58
-
59
- # SizedQueue should be constructable using the same calling
60
- # convention as multiprocessing.Queue but that entire signature
61
- # isn't expressible in mypy 0.790
62
- SizedQueue: Callable[..., multiprocessing.Queue]
63
-
64
-
65
- if platform.system() != 'Darwin':
66
- import multiprocessing
67
- SizedQueue = SpawnQueue
68
- else:
69
- SizedQueue = MacSafeQueue
70
-
71
-
72
23
  def join_terminate_close_proc(process: SpawnProcessType, *, timeout: int = 30) -> None:
73
24
  """Increasingly aggressively terminate a process.
74
25
 
@@ -296,48 +296,6 @@ def test_server_context_destroy(server_ctx: curvezmq.ServerContext, encrypted: b
296
296
  assert not server_ctx.auth_thread.pipe
297
297
 
298
298
 
299
- @pytest.mark.local
300
- @pytest.mark.parametrize("encrypted", (True, False), indirect=True)
301
- def test_client_context_recreate(client_ctx: curvezmq.ClientContext):
302
- hidden_ctx = client_ctx._ctx
303
- sock = client_ctx.socket(zmq.REQ)
304
-
305
- assert not sock.closed
306
- assert not client_ctx.closed
307
-
308
- client_ctx.recreate()
309
-
310
- assert sock.closed
311
- assert not client_ctx.closed
312
- assert hidden_ctx != client_ctx._ctx
313
- assert hidden_ctx.closed
314
-
315
-
316
- @pytest.mark.local
317
- @pytest.mark.parametrize("encrypted", (True, False), indirect=True)
318
- def test_server_context_recreate(server_ctx: curvezmq.ServerContext, encrypted: bool):
319
- hidden_ctx = server_ctx._ctx
320
- sock = server_ctx.socket(zmq.REP)
321
-
322
- assert not sock.closed
323
- assert not server_ctx.closed
324
- if encrypted:
325
- assert server_ctx.auth_thread
326
- auth_thread = server_ctx.auth_thread
327
- assert auth_thread.pipe
328
-
329
- server_ctx.recreate()
330
-
331
- assert sock.closed
332
- assert not server_ctx.closed
333
- assert hidden_ctx.closed
334
- assert hidden_ctx != server_ctx._ctx
335
- if encrypted:
336
- assert server_ctx.auth_thread
337
- assert auth_thread != server_ctx.auth_thread
338
- assert server_ctx.auth_thread.pipe
339
-
340
-
341
299
  @pytest.mark.local
342
300
  @pytest.mark.parametrize("encrypted", (True, False), indirect=True)
343
301
  def test_connection(
@@ -0,0 +1,54 @@
1
+ import time
2
+ from threading import Event, Thread
3
+
4
+ import pytest
5
+
6
+ import parsl
7
+ from parsl.tests.configs.htex_local import fresh_config as local_config
8
+
9
+ N_THREADS = 50
10
+ DURATION_S = 10
11
+
12
+
13
+ @pytest.mark.local
14
+ def test_concurrency_blast():
15
+ """Blast interchange command channel from many threads.
16
+ """
17
+
18
+ cc = parsl.dfk().executors['htex_local'].command_client
19
+
20
+ threads = []
21
+
22
+ ok_so_far = True
23
+
24
+ for _ in range(N_THREADS):
25
+
26
+ # This event will be set if the thread reaches the end of its body.
27
+ event = Event()
28
+
29
+ thread = Thread(target=blast, args=(cc, event))
30
+ threads.append((thread, event))
31
+
32
+ for thread, event in threads:
33
+ thread.start()
34
+
35
+ for thread, event in threads:
36
+ thread.join()
37
+ if not event.is_set():
38
+ ok_so_far = False
39
+
40
+ assert ok_so_far, "at least one thread did not exit normally"
41
+
42
+
43
+ def blast(cc, e):
44
+ target_end = time.monotonic() + DURATION_S
45
+
46
+ while time.monotonic() < target_end:
47
+ cc.run("WORKERS")
48
+ cc.run("MANGERs_PACKAGES")
49
+ cc.run("CONNECTED_BLOCKS")
50
+ cc.run("WORKER_BINDS")
51
+
52
+ # If any of the preceeding cc.run calls raises an exception, the thread
53
+ # will not set its successful completion event.
54
+ e.set()
@@ -50,7 +50,8 @@ def test_exit_with_bad_registration(tmpd_cwd, try_assert):
50
50
  "logging_level": logging.DEBUG,
51
51
  "cert_dir": None,
52
52
  "manager_selector": RandomManagerSelector(),
53
- "run_id": "test"
53
+ "run_id": "test",
54
+ "_check_python_mismatch": True,
54
55
  }
55
56
 
56
57
  config_pickle = pickle.dumps(interchange_config)
@@ -46,6 +46,7 @@ def test_priority_queue():
46
46
  futures[(priority, i)] = fake_task(parsl_resource_specification=spec)
47
47
 
48
48
  provider.max_blocks = 1
49
+ htex.scale_out_facade(1) # don't wait for the JSP to catch up
49
50
 
50
51
  # Wait for completion
51
52
  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
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.15'
@@ -56,6 +56,7 @@ class Interchange:
56
56
  cert_dir: Optional[str],
57
57
  manager_selector: ManagerSelector,
58
58
  run_id: str,
59
+ _check_python_mismatch: bool,
59
60
  ) -> None:
60
61
  """
61
62
  Parameters
@@ -99,6 +100,11 @@ class Interchange:
99
100
 
100
101
  cert_dir : str | None
101
102
  Path to the certificate directory.
103
+
104
+ _check_python_mismatch : bool
105
+ If True, the interchange and worker managers must run the same version of
106
+ Python. Running different versions can cause inter-process communication
107
+ errors, so proceed with caution.
102
108
  """
103
109
  self.cert_dir = cert_dir
104
110
  self.logdir = logdir
@@ -126,6 +132,7 @@ class Interchange:
126
132
  logger.info("Connected to client")
127
133
 
128
134
  self.run_id = run_id
135
+ self._check_python_mismatch = _check_python_mismatch
129
136
 
130
137
  self.hub_address = hub_address
131
138
  self.hub_zmq_port = hub_zmq_port
@@ -396,7 +403,9 @@ class Interchange:
396
403
  logger.info(f'Registration info for manager {manager_id!r}: {meta}')
397
404
  self._send_monitoring_info(monitoring_radio, new_rec)
398
405
 
399
- if (mgr_minor_py, mgr_parsl_v) != (ix_minor_py, ix_parsl_v):
406
+ python_mismatch: bool = ix_minor_py != mgr_minor_py
407
+ parsl_mismatch: bool = ix_parsl_v != mgr_parsl_v
408
+ if parsl_mismatch or (self._check_python_mismatch and python_mismatch):
400
409
  kill_event.set()
401
410
  vm_exc = VersionMismatch(
402
411
  f"py.v={ix_minor_py} parsl.v={ix_parsl_v}",
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: parsl
3
- Version: 2025.9.8
3
+ Version: 2025.9.15
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.15.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=04n0OtGcsR5PaVZquDBsldk0-OzzWFiR5c7fgxx8s94,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
@@ -75,8 +75,8 @@ parsl/executors/flux/executor.py,sha256=NLdjOli5VjrSdEfyWbfqKN_8APvFkp_qFCouS_9N
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=TpossRt_No5AwpJsg5tNQrkyUSVb1FzflPqgVo7AzsI,40407
79
+ parsl/executors/high_throughput/interchange.py,sha256=DYIZkgYxliW0iNwhF8P6yMv_24KQm9Vaz3OYhzRvpyw,26152
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
@@ -85,7 +85,7 @@ parsl/executors/high_throughput/mpi_prefix_composer.py,sha256=DmpKugANNa1bdYlqQB
85
85
  parsl/executors/high_throughput/mpi_resource_management.py,sha256=73bTW2ZbHRfcrPN318cyjiqDN50AM1cOCQqUGJDIlBg,8199
86
86
  parsl/executors/high_throughput/probe.py,sha256=QlBFwSSxMmtH-Aa2JEvCzQLddsbWZluMUxq5ypLR51E,3831
87
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
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
90
  parsl/executors/radical/executor.py,sha256=e3XS4mvug1uJ6wrt4UH6hBgfbDbc-mQH3xUW2ZmBsMQ,22888
91
91
  parsl/executors/radical/rpex_resources.py,sha256=Q7-0u3K447LBCe2y7mVcdw6jqWI7SdPXxCKhkr6FoRQ,5139
@@ -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
@@ -199,9 +199,8 @@ parsl/serialize/proxystore.py,sha256=o-ha9QAvVhbN8y9S1itk3W0O75eyHYZw2AvB2xu5_Lg
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
203
+ parsl/tests/test_curvezmq.py,sha256=CmLQforq2WPYFC5OsOGh5a9ujiEFKygktZi1mpOn3XU,11239
205
204
  parsl/tests/test_execute_task.py,sha256=lVZEcRocBTQHOQNEp8Gq858lQiYsTb6uI2jNxEUVog8,816
206
205
  parsl/tests/test_flux.py,sha256=TxkVPjksl1usdE9Y6y2FYhdOOmYFTlbEv_V9WnvF41A,5098
207
206
  parsl/tests/test_summary.py,sha256=x1RfWCFLzHjBw2ukwoRZPW1LFCKiwDmxx86ES-6yGRA,552
@@ -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=cxeM3WNO6hm2FRST3C_qCfejzXeYZMdim4ztRCwJMw8,2177
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
@@ -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
@@ -457,13 +452,13 @@ parsl/usage_tracking/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
457
452
  parsl/usage_tracking/api.py,sha256=iaCY58Dc5J4UM7_dJzEEs871P1p1HdxBMtNGyVdzc9g,1821
458
453
  parsl/usage_tracking/levels.py,sha256=xbfzYEsd55KiZJ-mzNgPebvOH4rRHum04hROzEf41tU,291
459
454
  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,,
455
+ parsl-2025.9.15.data/scripts/exec_parsl_function.py,sha256=YXKVVIa4zXmOtz-0Ca4E_5nQfN_3S2bh2tB75uZZB4w,7774
456
+ parsl-2025.9.15.data/scripts/interchange.py,sha256=ZAX7oUrTesSbXSu771fBN1Vm-7eAbMvfp5SjLRggt8E,26139
457
+ parsl-2025.9.15.data/scripts/parsl_coprocess.py,sha256=zrVjEqQvFOHxsLufPi00xzMONagjVwLZbavPM7bbjK4,5722
458
+ parsl-2025.9.15.data/scripts/process_worker_pool.py,sha256=-5VLVjeab6oROulx7OwI9tdNNHd6uap45I1jltm-UDc,40524
459
+ parsl-2025.9.15.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
460
+ parsl-2025.9.15.dist-info/METADATA,sha256=izlhMELBLUU4kbZ6vS0RigWGAjqv--7yoDthEFkwkW4,4055
461
+ parsl-2025.9.15.dist-info/WHEEL,sha256=tZoeGjtWxWRfdplE7E3d45VPlLNQnvbKiYnx7gwAy8A,92
462
+ parsl-2025.9.15.dist-info/entry_points.txt,sha256=XqnsWDYoEcLbsMcpnYGKLEnSBmaIe1YoM5YsBdJG2tI,176
463
+ parsl-2025.9.15.dist-info/top_level.txt,sha256=PIheYoUFQtF2icLsgOykgU-Cjuwr2Oi6On2jo5RYgRM,6
464
+ parsl-2025.9.15.dist-info/RECORD,,