parsl 2024.7.22__py3-none-any.whl → 2024.8.5__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 (34) hide show
  1. parsl/dataflow/dflow.py +4 -10
  2. parsl/executors/base.py +8 -8
  3. parsl/executors/flux/executor.py +7 -7
  4. parsl/executors/high_throughput/executor.py +55 -55
  5. parsl/executors/high_throughput/interchange.py +37 -37
  6. parsl/executors/high_throughput/manager_record.py +1 -0
  7. parsl/executors/high_throughput/manager_selector.py +25 -0
  8. parsl/executors/high_throughput/process_worker_pool.py +2 -0
  9. parsl/executors/status_handling.py +52 -21
  10. parsl/executors/taskvine/executor.py +0 -18
  11. parsl/executors/workqueue/executor.py +0 -18
  12. parsl/monitoring/errors.py +6 -0
  13. parsl/monitoring/monitoring.py +6 -5
  14. parsl/monitoring/radios.py +23 -7
  15. parsl/monitoring/remote.py +12 -12
  16. parsl/monitoring/router.py +71 -30
  17. parsl/tests/test_htex/test_disconnected_blocks_failing_provider.py +71 -0
  18. parsl/tests/test_htex/test_htex.py +28 -19
  19. parsl/tests/test_htex/test_zmq_binding.py +2 -0
  20. parsl/tests/test_monitoring/test_basic.py +14 -1
  21. parsl/tests/test_monitoring/test_fuzz_zmq.py +2 -2
  22. parsl/tests/test_mpi_apps/test_mpiex.py +1 -1
  23. parsl/version.py +1 -1
  24. {parsl-2024.7.22.data → parsl-2024.8.5.data}/scripts/interchange.py +37 -37
  25. {parsl-2024.7.22.data → parsl-2024.8.5.data}/scripts/process_worker_pool.py +2 -0
  26. parsl-2024.8.5.dist-info/METADATA +101 -0
  27. {parsl-2024.7.22.dist-info → parsl-2024.8.5.dist-info}/RECORD +33 -30
  28. {parsl-2024.7.22.dist-info → parsl-2024.8.5.dist-info}/WHEEL +1 -1
  29. parsl-2024.7.22.dist-info/METADATA +0 -101
  30. {parsl-2024.7.22.data → parsl-2024.8.5.data}/scripts/exec_parsl_function.py +0 -0
  31. {parsl-2024.7.22.data → parsl-2024.8.5.data}/scripts/parsl_coprocess.py +0 -0
  32. {parsl-2024.7.22.dist-info → parsl-2024.8.5.dist-info}/LICENSE +0 -0
  33. {parsl-2024.7.22.dist-info → parsl-2024.8.5.dist-info}/entry_points.txt +0 -0
  34. {parsl-2024.7.22.dist-info → parsl-2024.8.5.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,7 @@
1
+ import logging
1
2
  import pathlib
2
- import warnings
3
3
  from subprocess import Popen, TimeoutExpired
4
+ from typing import Optional, Sequence
4
5
  from unittest import mock
5
6
 
6
7
  import pytest
@@ -71,12 +72,11 @@ def test_htex_start_encrypted(
71
72
  @pytest.mark.local
72
73
  @pytest.mark.parametrize("started", (True, False))
73
74
  @pytest.mark.parametrize("timeout_expires", (True, False))
74
- @mock.patch(f"{_MOCK_BASE}.logger")
75
75
  def test_htex_shutdown(
76
- mock_logger: mock.MagicMock,
77
76
  started: bool,
78
77
  timeout_expires: bool,
79
78
  htex: HighThroughputExecutor,
79
+ caplog
80
80
  ):
81
81
  mock_ix_proc = mock.Mock(spec=Popen)
82
82
 
@@ -108,22 +108,22 @@ def test_htex_shutdown(
108
108
 
109
109
  mock_ix_proc.terminate.side_effect = kill_interchange
110
110
 
111
- htex.shutdown()
111
+ with caplog.at_level(logging.INFO):
112
+ htex.shutdown()
112
113
 
113
- mock_logs = mock_logger.info.call_args_list
114
114
  if started:
115
115
  assert mock_ix_proc.terminate.called
116
116
  assert mock_ix_proc.wait.called
117
117
  assert {"timeout": 10} == mock_ix_proc.wait.call_args[1]
118
118
  if timeout_expires:
119
- assert "Unable to terminate Interchange" in mock_logs[1][0][0]
119
+ assert "Unable to terminate Interchange" in caplog.text
120
120
  assert mock_ix_proc.kill.called
121
- assert "Attempting" in mock_logs[0][0][0]
122
- assert "Finished" in mock_logs[-1][0][0]
121
+ assert "Attempting HighThroughputExecutor shutdown" in caplog.text
122
+ assert "Finished HighThroughputExecutor shutdown" in caplog.text
123
123
  else:
124
124
  assert not mock_ix_proc.terminate.called
125
125
  assert not mock_ix_proc.wait.called
126
- assert "has not started" in mock_logs[0][0][0]
126
+ assert "HighThroughputExecutor has not started" in caplog.text
127
127
 
128
128
 
129
129
  @pytest.mark.local
@@ -139,13 +139,22 @@ def test_max_workers_per_node():
139
139
 
140
140
 
141
141
  @pytest.mark.local
142
- def test_htex_launch_cmd():
143
- htex = HighThroughputExecutor()
144
- assert htex.launch_cmd.startswith("process_worker_pool.py")
145
- assert htex.interchange_launch_cmd == "interchange.py"
146
-
147
- launch_cmd = "custom-launch-cmd"
148
- ix_launch_cmd = "custom-ix-launch-cmd"
149
- htex = HighThroughputExecutor(launch_cmd=launch_cmd, interchange_launch_cmd=ix_launch_cmd)
150
- assert htex.launch_cmd == launch_cmd
151
- assert htex.interchange_launch_cmd == ix_launch_cmd
142
+ @pytest.mark.parametrize("cmd", (None, "custom-launch-cmd"))
143
+ def test_htex_worker_pool_launch_cmd(cmd: Optional[str]):
144
+ if cmd:
145
+ htex = HighThroughputExecutor(launch_cmd=cmd)
146
+ assert htex.launch_cmd == cmd
147
+ else:
148
+ htex = HighThroughputExecutor()
149
+ assert htex.launch_cmd.startswith("process_worker_pool.py")
150
+
151
+
152
+ @pytest.mark.local
153
+ @pytest.mark.parametrize("cmd", (None, ["custom", "launch", "cmd"]))
154
+ def test_htex_interchange_launch_cmd(cmd: Optional[Sequence[str]]):
155
+ if cmd:
156
+ htex = HighThroughputExecutor(interchange_launch_cmd=cmd)
157
+ assert htex.interchange_launch_cmd == cmd
158
+ else:
159
+ htex = HighThroughputExecutor()
160
+ assert htex.interchange_launch_cmd == ["interchange.py"]
@@ -9,6 +9,7 @@ import zmq
9
9
 
10
10
  from parsl import curvezmq
11
11
  from parsl.executors.high_throughput.interchange import Interchange
12
+ from parsl.executors.high_throughput.manager_selector import RandomManagerSelector
12
13
 
13
14
 
14
15
  def make_interchange(*, interchange_address: Optional[str], cert_dir: Optional[str]) -> Interchange:
@@ -23,6 +24,7 @@ def make_interchange(*, interchange_address: Optional[str], cert_dir: Optional[s
23
24
  heartbeat_threshold=60,
24
25
  logdir=".",
25
26
  logging_level=logging.INFO,
27
+ manager_selector=RandomManagerSelector(),
26
28
  poll_period=10)
27
29
 
28
30
 
@@ -25,10 +25,23 @@ def this_app():
25
25
  # a configuration that is suitably configured for monitoring.
26
26
 
27
27
  def htex_config():
28
+ """This config will use htex's default htex-specific monitoring radio mode"""
28
29
  from parsl.tests.configs.htex_local_alternate import fresh_config
29
30
  return fresh_config()
30
31
 
31
32
 
33
+ def htex_udp_config():
34
+ """This config will force UDP"""
35
+ from parsl.tests.configs.htex_local_alternate import fresh_config
36
+ c = fresh_config()
37
+ assert len(c.executors) == 1
38
+
39
+ assert c.executors[0].radio_mode == "htex", "precondition: htex has a radio mode attribute, configured for htex radio"
40
+ c.executors[0].radio_mode = "udp"
41
+
42
+ return c
43
+
44
+
32
45
  def workqueue_config():
33
46
  from parsl.tests.configs.workqueue_ex import fresh_config
34
47
  c = fresh_config()
@@ -48,7 +61,7 @@ def taskvine_config():
48
61
 
49
62
 
50
63
  @pytest.mark.local
51
- @pytest.mark.parametrize("fresh_config", [htex_config, workqueue_config, taskvine_config])
64
+ @pytest.mark.parametrize("fresh_config", [htex_config, htex_udp_config, workqueue_config, taskvine_config])
52
65
  def test_row_counts(tmpd_cwd, fresh_config):
53
66
  # this is imported here rather than at module level because
54
67
  # it isn't available in a plain parsl install, so this module
@@ -44,8 +44,8 @@ def test_row_counts():
44
44
  # the latter is what i'm most suspicious of in my present investigation
45
45
 
46
46
  # dig out the interchange port...
47
- hub_address = parsl.dfk().hub_address
48
- hub_zmq_port = parsl.dfk().hub_zmq_port
47
+ hub_address = parsl.dfk().monitoring.hub_address
48
+ hub_zmq_port = parsl.dfk().monitoring.hub_zmq_port
49
49
 
50
50
  # this will send a string to a new socket connection
51
51
  with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
@@ -44,7 +44,7 @@ def test_init():
44
44
 
45
45
  new_kwargs = {'max_workers_per_block'}
46
46
  excluded_kwargs = {'available_accelerators', 'enable_mpi_mode', 'cores_per_worker', 'max_workers_per_node',
47
- 'mem_per_worker', 'cpu_affinity', 'max_workers'}
47
+ 'mem_per_worker', 'cpu_affinity', 'max_workers', 'manager_selector'}
48
48
 
49
49
  # Get the kwargs from both HTEx and MPIEx
50
50
  htex_kwargs = set(signature(HighThroughputExecutor.__init__).parameters)
parsl/version.py CHANGED
@@ -3,4 +3,4 @@
3
3
  Year.Month.Day[alpha/beta/..]
4
4
  Alphas will be numbered like this -> 2024.12.10a0
5
5
  """
6
- VERSION = '2024.07.22'
6
+ VERSION = '2024.08.05'
@@ -6,7 +6,6 @@ import os
6
6
  import pickle
7
7
  import platform
8
8
  import queue
9
- import random
10
9
  import signal
11
10
  import sys
12
11
  import threading
@@ -19,7 +18,9 @@ from parsl import curvezmq
19
18
  from parsl.app.errors import RemoteExceptionWrapper
20
19
  from parsl.executors.high_throughput.errors import ManagerLost, VersionMismatch
21
20
  from parsl.executors.high_throughput.manager_record import ManagerRecord
21
+ from parsl.executors.high_throughput.manager_selector import ManagerSelector
22
22
  from parsl.monitoring.message_type import MessageType
23
+ from parsl.monitoring.radios import MonitoringRadioSender, ZMQRadioSender
23
24
  from parsl.process_loggers import wrap_with_logs
24
25
  from parsl.serialize import serialize as serialize_object
25
26
  from parsl.utils import setproctitle
@@ -53,6 +54,7 @@ class Interchange:
53
54
  logging_level: int,
54
55
  poll_period: int,
55
56
  cert_dir: Optional[str],
57
+ manager_selector: ManagerSelector,
56
58
  ) -> None:
57
59
  """
58
60
  Parameters
@@ -160,6 +162,8 @@ class Interchange:
160
162
 
161
163
  self.heartbeat_threshold = heartbeat_threshold
162
164
 
165
+ self.manager_selector = manager_selector
166
+
163
167
  self.current_platform = {'parsl_v': PARSL_VERSION,
164
168
  'python_v': "{}.{}.{}".format(sys.version_info.major,
165
169
  sys.version_info.minor,
@@ -216,27 +220,15 @@ class Interchange:
216
220
  task_counter += 1
217
221
  logger.debug(f"Fetched {task_counter} tasks so far")
218
222
 
219
- def _create_monitoring_channel(self) -> Optional[zmq.Socket]:
220
- if self.hub_address and self.hub_zmq_port:
221
- logger.info("Connecting to MonitoringHub")
222
- # This is a one-off because monitoring is unencrypted
223
- hub_channel = zmq.Context().socket(zmq.DEALER)
224
- hub_channel.set_hwm(0)
225
- hub_channel.connect("tcp://{}:{}".format(self.hub_address, self.hub_zmq_port))
226
- logger.info("Connected to MonitoringHub")
227
- return hub_channel
228
- else:
229
- return None
230
-
231
- def _send_monitoring_info(self, hub_channel: Optional[zmq.Socket], manager: ManagerRecord) -> None:
232
- if hub_channel:
223
+ def _send_monitoring_info(self, monitoring_radio: Optional[MonitoringRadioSender], manager: ManagerRecord) -> None:
224
+ if monitoring_radio:
233
225
  logger.info("Sending message {} to MonitoringHub".format(manager))
234
226
 
235
227
  d: Dict = cast(Dict, manager.copy())
236
228
  d['timestamp'] = datetime.datetime.now()
237
229
  d['last_heartbeat'] = datetime.datetime.fromtimestamp(d['last_heartbeat'])
238
230
 
239
- hub_channel.send_pyobj((MessageType.NODE_INFO, d))
231
+ monitoring_radio.send((MessageType.NODE_INFO, d))
240
232
 
241
233
  @wrap_with_logs(target="interchange")
242
234
  def _command_server(self) -> NoReturn:
@@ -244,8 +236,11 @@ class Interchange:
244
236
  """
245
237
  logger.debug("Command Server Starting")
246
238
 
247
- # Need to create a new ZMQ socket for command server thread
248
- hub_channel = self._create_monitoring_channel()
239
+ if self.hub_address is not None and self.hub_zmq_port is not None:
240
+ logger.debug("Creating monitoring radio to %s:%s", self.hub_address, self.hub_zmq_port)
241
+ monitoring_radio = ZMQRadioSender(self.hub_address, self.hub_zmq_port)
242
+ else:
243
+ monitoring_radio = None
249
244
 
250
245
  reply: Any # the type of reply depends on the command_req received (aka this needs dependent types...)
251
246
 
@@ -295,7 +290,7 @@ class Interchange:
295
290
  if manager_id in self._ready_managers:
296
291
  m = self._ready_managers[manager_id]
297
292
  m['active'] = False
298
- self._send_monitoring_info(hub_channel, m)
293
+ self._send_monitoring_info(monitoring_radio, m)
299
294
  else:
300
295
  logger.warning("Worker to hold was not in ready managers list")
301
296
 
@@ -330,9 +325,14 @@ class Interchange:
330
325
  # parent-process-inheritance problems.
331
326
  signal.signal(signal.SIGTERM, signal.SIG_DFL)
332
327
 
333
- logger.info("Incoming ports bound")
328
+ logger.info("Starting main interchange method")
334
329
 
335
- hub_channel = self._create_monitoring_channel()
330
+ if self.hub_address is not None and self.hub_zmq_port is not None:
331
+ logger.debug("Creating monitoring radio to %s:%s", self.hub_address, self.hub_zmq_port)
332
+ monitoring_radio = ZMQRadioSender(self.hub_address, self.hub_zmq_port)
333
+ logger.debug("Created monitoring radio")
334
+ else:
335
+ monitoring_radio = None
336
336
 
337
337
  poll_period = self.poll_period
338
338
 
@@ -363,10 +363,10 @@ class Interchange:
363
363
  while not kill_event.is_set():
364
364
  self.socks = dict(poller.poll(timeout=poll_period))
365
365
 
366
- self.process_task_outgoing_incoming(interesting_managers, hub_channel, kill_event)
367
- self.process_results_incoming(interesting_managers, hub_channel)
368
- self.expire_bad_managers(interesting_managers, hub_channel)
369
- self.expire_drained_managers(interesting_managers, hub_channel)
366
+ self.process_task_outgoing_incoming(interesting_managers, monitoring_radio, kill_event)
367
+ self.process_results_incoming(interesting_managers, monitoring_radio)
368
+ self.expire_bad_managers(interesting_managers, monitoring_radio)
369
+ self.expire_drained_managers(interesting_managers, monitoring_radio)
370
370
  self.process_tasks_to_send(interesting_managers)
371
371
 
372
372
  self.zmq_context.destroy()
@@ -377,7 +377,7 @@ class Interchange:
377
377
  def process_task_outgoing_incoming(
378
378
  self,
379
379
  interesting_managers: Set[bytes],
380
- hub_channel: Optional[zmq.Socket],
380
+ monitoring_radio: Optional[MonitoringRadioSender],
381
381
  kill_event: threading.Event
382
382
  ) -> None:
383
383
  """Process one message from manager on the task_outgoing channel.
@@ -410,6 +410,7 @@ class Interchange:
410
410
  self._ready_managers[manager_id] = {'last_heartbeat': time.time(),
411
411
  'idle_since': time.time(),
412
412
  'block_id': None,
413
+ 'start_time': msg['start_time'],
413
414
  'max_capacity': 0,
414
415
  'worker_count': 0,
415
416
  'active': True,
@@ -430,7 +431,7 @@ class Interchange:
430
431
  m.update(msg) # type: ignore[typeddict-item]
431
432
 
432
433
  logger.info("Registration info for manager {!r}: {}".format(manager_id, msg))
433
- self._send_monitoring_info(hub_channel, m)
434
+ self._send_monitoring_info(monitoring_radio, m)
434
435
 
435
436
  if (msg['python_v'].rsplit(".", 1)[0] != self.current_platform['python_v'].rsplit(".", 1)[0] or
436
437
  msg['parsl_v'] != self.current_platform['parsl_v']):
@@ -461,7 +462,7 @@ class Interchange:
461
462
  logger.error(f"Unexpected message type received from manager: {msg['type']}")
462
463
  logger.debug("leaving task_outgoing section")
463
464
 
464
- def expire_drained_managers(self, interesting_managers: Set[bytes], hub_channel: Optional[zmq.Socket]) -> None:
465
+ def expire_drained_managers(self, interesting_managers: Set[bytes], monitoring_radio: Optional[MonitoringRadioSender]) -> None:
465
466
 
466
467
  for manager_id in list(interesting_managers):
467
468
  # is it always true that a draining manager will be in interesting managers?
@@ -474,7 +475,7 @@ class Interchange:
474
475
  self._ready_managers.pop(manager_id)
475
476
 
476
477
  m['active'] = False
477
- self._send_monitoring_info(hub_channel, m)
478
+ self._send_monitoring_info(monitoring_radio, m)
478
479
 
479
480
  def process_tasks_to_send(self, interesting_managers: Set[bytes]) -> None:
480
481
  # Check if there are tasks that could be sent to managers
@@ -484,8 +485,7 @@ class Interchange:
484
485
  interesting=len(interesting_managers)))
485
486
 
486
487
  if interesting_managers and not self.pending_task_queue.empty():
487
- shuffled_managers = list(interesting_managers)
488
- random.shuffle(shuffled_managers)
488
+ shuffled_managers = self.manager_selector.sort_managers(self._ready_managers, interesting_managers)
489
489
 
490
490
  while shuffled_managers and not self.pending_task_queue.empty(): # cf. the if statement above...
491
491
  manager_id = shuffled_managers.pop()
@@ -518,7 +518,7 @@ class Interchange:
518
518
  else:
519
519
  logger.debug("either no interesting managers or no tasks, so skipping manager pass")
520
520
 
521
- def process_results_incoming(self, interesting_managers: Set[bytes], hub_channel: Optional[zmq.Socket]) -> None:
521
+ def process_results_incoming(self, interesting_managers: Set[bytes], monitoring_radio: Optional[MonitoringRadioSender]) -> None:
522
522
  # Receive any results and forward to client
523
523
  if self.results_incoming in self.socks and self.socks[self.results_incoming] == zmq.POLLIN:
524
524
  logger.debug("entering results_incoming section")
@@ -538,11 +538,11 @@ class Interchange:
538
538
  elif r['type'] == 'monitoring':
539
539
  # the monitoring code makes the assumption that no
540
540
  # monitoring messages will be received if monitoring
541
- # is not configured, and that hub_channel will only
541
+ # is not configured, and that monitoring_radio will only
542
542
  # be None when monitoring is not configurated.
543
- assert hub_channel is not None
543
+ assert monitoring_radio is not None
544
544
 
545
- hub_channel.send_pyobj(r['payload'])
545
+ monitoring_radio.send(r['payload'])
546
546
  elif r['type'] == 'heartbeat':
547
547
  logger.debug(f"Manager {manager_id!r} sent heartbeat via results connection")
548
548
  b_messages.append((p_message, r))
@@ -586,7 +586,7 @@ class Interchange:
586
586
  interesting_managers.add(manager_id)
587
587
  logger.debug("leaving results_incoming section")
588
588
 
589
- def expire_bad_managers(self, interesting_managers: Set[bytes], hub_channel: Optional[zmq.Socket]) -> None:
589
+ def expire_bad_managers(self, interesting_managers: Set[bytes], monitoring_radio: Optional[MonitoringRadioSender]) -> None:
590
590
  bad_managers = [(manager_id, m) for (manager_id, m) in self._ready_managers.items() if
591
591
  time.time() - m['last_heartbeat'] > self.heartbeat_threshold]
592
592
  for (manager_id, m) in bad_managers:
@@ -594,7 +594,7 @@ class Interchange:
594
594
  logger.warning(f"Too many heartbeats missed for manager {manager_id!r} - removing manager")
595
595
  if m['active']:
596
596
  m['active'] = False
597
- self._send_monitoring_info(hub_channel, m)
597
+ self._send_monitoring_info(monitoring_radio, m)
598
598
 
599
599
  logger.warning(f"Cancelling htex tasks {m['tasks']} on removed manager")
600
600
  for tid in m['tasks']:
@@ -184,6 +184,7 @@ class Manager:
184
184
 
185
185
  self.uid = uid
186
186
  self.block_id = block_id
187
+ self.start_time = time.time()
187
188
 
188
189
  self.enable_mpi_mode = enable_mpi_mode
189
190
  self.mpi_launcher = mpi_launcher
@@ -263,6 +264,7 @@ class Manager:
263
264
  'worker_count': self.worker_count,
264
265
  'uid': self.uid,
265
266
  'block_id': self.block_id,
267
+ 'start_time': self.start_time,
266
268
  'prefetch_capacity': self.prefetch_capacity,
267
269
  'max_capacity': self.worker_count + self.prefetch_capacity,
268
270
  'os': platform.system(),
@@ -0,0 +1,101 @@
1
+ Metadata-Version: 2.1
2
+ Name: parsl
3
+ Version: 2024.8.5
4
+ Summary: Simple data dependent workflows in Python
5
+ Home-page: https://github.com/Parsl/parsl
6
+ Download-URL: https://github.com/Parsl/parsl/archive/2024.08.05.tar.gz
7
+ Author: The Parsl Team
8
+ Author-email: parsl@googlegroups.com
9
+ License: Apache 2.0
10
+ Keywords: Workflows,Scientific computing
11
+ Classifier: Development Status :: 5 - Production/Stable
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: Apache Software License
14
+ Classifier: Programming Language :: Python :: 3.8
15
+ Classifier: Programming Language :: Python :: 3.9
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Requires-Python: >=3.8.0
20
+ License-File: LICENSE
21
+ Requires-Dist: pyzmq>=17.1.2
22
+ Requires-Dist: typeguard!=3.*,<5,>=2.10
23
+ Requires-Dist: typing-extensions<5,>=4.6
24
+ Requires-Dist: globus-sdk
25
+ Requires-Dist: dill
26
+ Requires-Dist: tblib
27
+ Requires-Dist: requests
28
+ Requires-Dist: paramiko
29
+ Requires-Dist: psutil>=5.5.1
30
+ Requires-Dist: setproctitle
31
+ Requires-Dist: filelock<4,>=3.13
32
+ Provides-Extra: all
33
+ Requires-Dist: sqlalchemy<2,>=1.4; extra == "all"
34
+ Requires-Dist: pydot; extra == "all"
35
+ Requires-Dist: networkx<2.6,>=2.5; extra == "all"
36
+ Requires-Dist: Flask>=1.0.2; extra == "all"
37
+ Requires-Dist: flask-sqlalchemy; extra == "all"
38
+ Requires-Dist: pandas<2.2; extra == "all"
39
+ Requires-Dist: plotly; extra == "all"
40
+ Requires-Dist: python-daemon; extra == "all"
41
+ Requires-Dist: boto3; extra == "all"
42
+ Requires-Dist: kubernetes; extra == "all"
43
+ Requires-Dist: oauth-ssh>=0.9; extra == "all"
44
+ Requires-Dist: ipython<=8.6.0; extra == "all"
45
+ Requires-Dist: nbsphinx; extra == "all"
46
+ Requires-Dist: sphinx<7.2,>=7.1; extra == "all"
47
+ Requires-Dist: sphinx-rtd-theme; extra == "all"
48
+ Requires-Dist: google-auth; extra == "all"
49
+ Requires-Dist: google-api-python-client; extra == "all"
50
+ Requires-Dist: python-gssapi; extra == "all"
51
+ Requires-Dist: azure<=4; extra == "all"
52
+ Requires-Dist: msrestazure; extra == "all"
53
+ Requires-Dist: work-queue; extra == "all"
54
+ Requires-Dist: pyyaml; extra == "all"
55
+ Requires-Dist: cffi; extra == "all"
56
+ Requires-Dist: jsonschema; extra == "all"
57
+ Requires-Dist: proxystore; extra == "all"
58
+ Requires-Dist: radical.pilot==1.60; extra == "all"
59
+ Requires-Dist: radical.utils==1.60; extra == "all"
60
+ Provides-Extra: aws
61
+ Requires-Dist: boto3; extra == "aws"
62
+ Provides-Extra: azure
63
+ Requires-Dist: azure<=4; extra == "azure"
64
+ Requires-Dist: msrestazure; extra == "azure"
65
+ Provides-Extra: docs
66
+ Requires-Dist: ipython<=8.6.0; extra == "docs"
67
+ Requires-Dist: nbsphinx; extra == "docs"
68
+ Requires-Dist: sphinx<7.2,>=7.1; extra == "docs"
69
+ Requires-Dist: sphinx-rtd-theme; extra == "docs"
70
+ Provides-Extra: flux
71
+ Requires-Dist: pyyaml; extra == "flux"
72
+ Requires-Dist: cffi; extra == "flux"
73
+ Requires-Dist: jsonschema; extra == "flux"
74
+ Provides-Extra: google_cloud
75
+ Requires-Dist: google-auth; extra == "google-cloud"
76
+ Requires-Dist: google-api-python-client; extra == "google-cloud"
77
+ Provides-Extra: gssapi
78
+ Requires-Dist: python-gssapi; extra == "gssapi"
79
+ Provides-Extra: kubernetes
80
+ Requires-Dist: kubernetes; extra == "kubernetes"
81
+ Provides-Extra: monitoring
82
+ Requires-Dist: sqlalchemy<2,>=1.4; extra == "monitoring"
83
+ Provides-Extra: oauth_ssh
84
+ Requires-Dist: oauth-ssh>=0.9; extra == "oauth-ssh"
85
+ Provides-Extra: proxystore
86
+ Requires-Dist: proxystore; extra == "proxystore"
87
+ Provides-Extra: radical-pilot
88
+ Requires-Dist: radical.pilot==1.60; extra == "radical-pilot"
89
+ Requires-Dist: radical.utils==1.60; extra == "radical-pilot"
90
+ Provides-Extra: visualization
91
+ Requires-Dist: pydot; extra == "visualization"
92
+ Requires-Dist: networkx<2.6,>=2.5; extra == "visualization"
93
+ Requires-Dist: Flask>=1.0.2; extra == "visualization"
94
+ Requires-Dist: flask-sqlalchemy; extra == "visualization"
95
+ Requires-Dist: pandas<2.2; extra == "visualization"
96
+ Requires-Dist: plotly; extra == "visualization"
97
+ Requires-Dist: python-daemon; extra == "visualization"
98
+ Provides-Extra: workqueue
99
+ Requires-Dist: work-queue; extra == "workqueue"
100
+
101
+ Simple parallel workflows system for Python
@@ -8,7 +8,7 @@ parsl/multiprocessing.py,sha256=MyaEcEq-Qf860u7V98u-PZrPNdtzOZL_NW6EhIJnmfQ,1937
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=91FjQiTUY383ueAjkBAgE21My9nba6SP2a2SrbB1r1Q,11250
11
- parsl/version.py,sha256=MTzhueu1_EeHa7_SmFzbomAqeyRCXKJ4cimHiEDRYbs,131
11
+ parsl/version.py,sha256=Q4Vgcw4p_9D05HbgIMARfR7GS0_NIA80y2iwiXamViY,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
@@ -62,7 +62,7 @@ parsl/data_provider/staging.py,sha256=ZDZuuFg38pjUStegKPcvPsfGp3iMeReMzfU6DSwtJj
62
62
  parsl/data_provider/zip.py,sha256=S4kVuH9lxAegRURYbvIUR7EYYBOccyslaqyCrVWUBhw,4497
63
63
  parsl/dataflow/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
64
64
  parsl/dataflow/dependency_resolvers.py,sha256=Om8Dgh7a0ZwgXAc6TlhxLSzvxXHDlNNV1aBNiD3JTNY,3325
65
- parsl/dataflow/dflow.py,sha256=jgNOIk3xXz90RXwC38ujMz7092XRdLFv5BrMyALYhps,68513
65
+ parsl/dataflow/dflow.py,sha256=StuwMnBoZQBkIthWY1O1QU1LDYEHbvtMJZYn4G0I5hc,68263
66
66
  parsl/dataflow/errors.py,sha256=9SxVhIJY_53FQx8x4OU8UA8nd7lvUbDllH7KfMXpYaY,2177
67
67
  parsl/dataflow/futures.py,sha256=08LuP-HFiHBIZmeKCjlsazw_WpQ5fwevrU2_WbidkYw,6080
68
68
  parsl/dataflow/memoization.py,sha256=l9uw1Bu50GucBF70M5relpGKFkE4dIM9T3R1KrxW0v0,9583
@@ -70,25 +70,26 @@ parsl/dataflow/rundirs.py,sha256=7aUg1cb0LLTocQxOdBzwtn7a8bIgpdMD5rjZV55UwaQ,115
70
70
  parsl/dataflow/states.py,sha256=hV6mfv-y4A6xrujeQglcomnfEs7y3Xm2g6JFwC6dvgQ,2612
71
71
  parsl/dataflow/taskrecord.py,sha256=-FuujdZQ1y5GSc-PJ91QKGT-Kp0lrg70MFDoxpbWI1Q,3113
72
72
  parsl/executors/__init__.py,sha256=Cg8e-F2NUaBD8A9crDAXKCSdoBEwQVIdgm4FlXd-wvk,476
73
- parsl/executors/base.py,sha256=10xMzqVa2vV7muet08Tm1iHBZ4m2jCESPPiRnbwzGUk,5120
73
+ parsl/executors/base.py,sha256=5A59mCXPjYNCep9JgfvIjBdZvGV-1mNVHklr-ZIEojg,5200
74
74
  parsl/executors/errors.py,sha256=xVswxgi7vmJcUMCeYDAPK8sQT2kHFFROVoOr0dnmcWE,2098
75
- parsl/executors/status_handling.py,sha256=Hwcp8eCJSc_vVXycZX2vPTfikAP1SigtQJEiYbarjLw,13784
75
+ parsl/executors/status_handling.py,sha256=XtFVifRwnLU2Lq1E4XsyPwUzMXZCOMecWL-jRCqpDyk,15269
76
76
  parsl/executors/threads.py,sha256=hJt1LzxphqX4fe_9R9Cf1MU0lepWTU_eJe8O665B0Xo,3352
77
77
  parsl/executors/flux/__init__.py,sha256=P9grTTeRPXfqXurFhlSS7XhmE6tTbnCnyQ1f9b-oYHE,136
78
78
  parsl/executors/flux/execute_parsl_task.py,sha256=gRN7F4HhdrKQ-bvn4wXrquBzFOp_9WF88hMIeUaRg5I,1553
79
- parsl/executors/flux/executor.py,sha256=gPq49CQwtSZYZggLZ0dCXdpUlllKHJbvR8WRKeGh9xE,16977
79
+ parsl/executors/flux/executor.py,sha256=8_xakLUu5zNJAHL0LbeTCFEWqWzRK1eE-3ep4GIIIrY,17017
80
80
  parsl/executors/flux/flux_instance_manager.py,sha256=5T3Rp7ZM-mlT0Pf0Gxgs5_YmnaPrSF9ec7zvRfLfYJw,2129
81
81
  parsl/executors/high_throughput/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
82
82
  parsl/executors/high_throughput/errors.py,sha256=Sak8e8UpiEcXefUjMHbhyXc4Rn7kJtOoh7L8wreBQdk,1638
83
- parsl/executors/high_throughput/executor.py,sha256=bCtw_p2f1ztnqQiChKJBOiPyc6aKK39yRXSp5uFpRzk,38185
84
- parsl/executors/high_throughput/interchange.py,sha256=IRuiaBmks_R4cU-Sx0Q_Fjv4PdFtzU05GiPdeJstOoA,30578
85
- parsl/executors/high_throughput/manager_record.py,sha256=9XppKjDW0DJ7SMkPNxsiDs-HvXGPLrTg6Ceyh4b6gNs,433
83
+ parsl/executors/high_throughput/executor.py,sha256=nCCLGjMFIYGHir5CYqRqrznQky_K3UWNKVPk4aT5w-s,38165
84
+ parsl/executors/high_throughput/interchange.py,sha256=uWYg8NYMmeIxgyVCy1MuY56P3lrbxSSOO9pVoIjRwbo,30996
85
+ parsl/executors/high_throughput/manager_record.py,sha256=yn3L8TUJFkgm2lX1x0SeS9mkvJowC0s2VIMCFiU7ThM,455
86
+ parsl/executors/high_throughput/manager_selector.py,sha256=uRaEtcbDO2vXf8vjEcm7bfZVdeUlSPTRc3G4oFRO29M,820
86
87
  parsl/executors/high_throughput/monitoring_info.py,sha256=HC0drp6nlXQpAop5PTUKNjdXMgtZVvrBL0JzZJebPP4,298
87
88
  parsl/executors/high_throughput/mpi_executor.py,sha256=V07t1GOzFhcwdlZGuYUPqc1NarSr-vUbsNzbK4Cj0m8,3882
88
89
  parsl/executors/high_throughput/mpi_prefix_composer.py,sha256=hah_IznfFqk-rzuHWmg6aiF_saiDRrpW-aSo4kH9Nso,4854
89
90
  parsl/executors/high_throughput/mpi_resource_management.py,sha256=LFBbJ3BnzTcY_v-jNu30uoIB2Enk4cleN4ygY3dncjY,8194
90
91
  parsl/executors/high_throughput/probe.py,sha256=TNpGTXb4_DEeg_h-LHu4zEKi1-hffboxvKcZUl2OZGk,2751
91
- parsl/executors/high_throughput/process_worker_pool.py,sha256=weEld9iZr669gGmPxJC77ISVop7Y47Lc8TkjEfmnAyk,42991
92
+ parsl/executors/high_throughput/process_worker_pool.py,sha256=3s-Ouo3ZEhod7hon8euyL37t1DbP5pSVjXyC23DSN_0,43075
92
93
  parsl/executors/high_throughput/zmq_pipes.py,sha256=tAjQB3aNVMuTXziN3dbJWre46YpXgliD55qMBbhYTLU,8581
93
94
  parsl/executors/radical/__init__.py,sha256=CKbtV2numw5QvgIBq1htMUrt9TqDCIC2zifyf2svTNU,186
94
95
  parsl/executors/radical/executor.py,sha256=426cMt6d8uJFZ_7Ub1kCslaND4OKtBX5WZdz-0RXjMk,22554
@@ -97,7 +98,7 @@ parsl/executors/radical/rpex_worker.py,sha256=qli6i6ejKubTSv3lAE3YiW8RlkHrfl4Jhr
97
98
  parsl/executors/taskvine/__init__.py,sha256=9rwp3M8B0YyEhZMLO0RHaNw7u1nc01WHbXLqnBTanu0,293
98
99
  parsl/executors/taskvine/errors.py,sha256=euIYkSslrNSI85kyi2s0xzOaO9ik4c1fYHstMIeiBJk,652
99
100
  parsl/executors/taskvine/exec_parsl_function.py,sha256=ftGdJU78lKPPkphSHlEi4rj164mhuMHJjghVqfgeXKk,7085
100
- parsl/executors/taskvine/executor.py,sha256=lZXfXXzkufLsoxAhf3hOMx05qTmwgd-osh2TMy1S4MM,31722
101
+ parsl/executors/taskvine/executor.py,sha256=XsUzFWgFWbxf06jDLMAKiXUF-F1_VLheZ5jhAwSphZk,30977
101
102
  parsl/executors/taskvine/factory.py,sha256=rWpEoFphLzqO3HEYyDEbQa14iyvgkdZg7hLZuaY39gQ,2638
102
103
  parsl/executors/taskvine/factory_config.py,sha256=AbE2fN2snrF5ITYrrS4DnGn2XkJHUFr_17DYHDHIwq0,3693
103
104
  parsl/executors/taskvine/manager.py,sha256=fwRSgYWpbsnr5jXlzvX0sQjOqryqn_77K_svJJ1HJ2U,25631
@@ -106,7 +107,7 @@ parsl/executors/taskvine/utils.py,sha256=iSrIogeiauL3UNy_9tiZp1cBSNn6fIJkMYQRVi1
106
107
  parsl/executors/workqueue/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
107
108
  parsl/executors/workqueue/errors.py,sha256=XO2naYhAsHHyiOBH6hpObg3mPNDmvMoFqErsj0-v7jc,541
108
109
  parsl/executors/workqueue/exec_parsl_function.py,sha256=RUkJ4JSJAjr7YyRZ58zhMdg8cR5dVV9odUl3AuzNf3k,7802
109
- parsl/executors/workqueue/executor.py,sha256=K5q-poZU37LVF4YhX34jKVMIBw5jpBfQ1rUadgPeQBU,50519
110
+ parsl/executors/workqueue/executor.py,sha256=YaY_U5DxXU2NbswmlrcJ2BtXvSbV0ElM9ZlQzP_F_BU,49803
110
111
  parsl/executors/workqueue/parsl_coprocess.py,sha256=cF1UmTgVLoey6QzBcbYgEiEsRidSaFfuO54f1HFw_EM,5737
111
112
  parsl/executors/workqueue/parsl_coprocess_stub.py,sha256=_bJmpPIgL42qM6bVzeEKt1Mn1trSP41rtJguXxPGfHI,735
112
113
  parsl/jobs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -121,11 +122,12 @@ parsl/launchers/errors.py,sha256=8YMV_CHpBNVa4eXkGE4x5DaFQlZkDCRCHmBktYcY6TA,467
121
122
  parsl/launchers/launchers.py,sha256=VB--fiVv_IQne3DydTMSdGUY0o0g69puAs-Hd3mJ2vo,15464
122
123
  parsl/monitoring/__init__.py,sha256=0ywNz6i0lM1xo_7_BIxhETDGeVd2C_0wwD7qgeaMR4c,83
123
124
  parsl/monitoring/db_manager.py,sha256=qPdW_MINycSn6MxxFk2s_R-t8g1cbJhxncVR5mDgeGs,37011
125
+ parsl/monitoring/errors.py,sha256=D6jpYzEzp0d6FmVKGqhvjAxr4ztZfJX2s-aXemH9bBU,148
124
126
  parsl/monitoring/message_type.py,sha256=Khn88afNxcOIciKiCK4GLnn90I5BlRTiOL3zK-P07yQ,401
125
- parsl/monitoring/monitoring.py,sha256=TCJsDbD3bLU77QrCqfCkLfC0e3Ih0FQLvtbYtgDs3RE,13522
126
- parsl/monitoring/radios.py,sha256=LkSW8LAW6MT9mNdHgRpUDPKkLcO-nyGU6uzWv3TLloE,5847
127
- parsl/monitoring/remote.py,sha256=IWDYCV8du2yB-YTqXjqGWELfi07ZWSENGq8mc4c4it0,13699
128
- parsl/monitoring/router.py,sha256=l1LBT1hxCWQ2mxCR-PtxwYJ905In61E4pPJB2K2J7kM,9554
127
+ parsl/monitoring/monitoring.py,sha256=Sr1PIue0ZzBSBbbLDnT477iRNecizt8CVh7easaLGsY,13601
128
+ parsl/monitoring/radios.py,sha256=cHdpBOW1ITYvFnOgYjziuZOauq8p7mlSBOvcbIP78mg,6437
129
+ parsl/monitoring/remote.py,sha256=qH1N3My8F473CHKxFrA2CsaL0Uege26tQi9-KrWQrr4,13771
130
+ parsl/monitoring/router.py,sha256=Gn8nzgGABlN-048c3bJqAojd2umnIqcTe17Mq-XnCgI,11423
129
131
  parsl/monitoring/types.py,sha256=_WGizCTgQVOkJ2dvNfsvHpYBj21Ky3bJsmyIskIx10I,631
130
132
  parsl/monitoring/queries/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
131
133
  parsl/monitoring/queries/pandas.py,sha256=0Z2r0rjTKCemf0eaDkF1irvVHn5g7KC5SYETvQPRxwU,2232
@@ -343,19 +345,20 @@ parsl/tests/test_htex/test_command_client_timeout.py,sha256=5tBViUhPT1ejnDDztTcE
343
345
  parsl/tests/test_htex/test_connected_blocks.py,sha256=gaXZSr__pIaLvKY6rF-4r1p_4dO5V28gtxHLT-psEFg,1640
344
346
  parsl/tests/test_htex/test_cpu_affinity_explicit.py,sha256=DVHrRCskDbJIrfB5YSi3ZSbfR4WzijA46aZfZzjNcrU,1382
345
347
  parsl/tests/test_htex/test_disconnected_blocks.py,sha256=3V1Ol9gMS6knjLTgIjB5GrunRSp4ANsJ_2vAvpyMR6c,1858
348
+ parsl/tests/test_htex/test_disconnected_blocks_failing_provider.py,sha256=eOdipRpKMOkWAXB3UtY1UjqTiwfNs_csNLve8vllG_M,2040
346
349
  parsl/tests/test_htex/test_drain.py,sha256=Z2Z5-3NfLL9tMgJh4JkVKLZZDl3Z2gDAbEFHDSGdItw,2288
347
- parsl/tests/test_htex/test_htex.py,sha256=qnJ1LjCC2c75BOxZ4CRA7pEX2RrFKG-fWIuPiW6w9k4,5005
350
+ parsl/tests/test_htex/test_htex.py,sha256=5ylQvWgmSLP3lOdoHxqK9wkvAgfgeJx6gihKPkN8XfU,5320
348
351
  parsl/tests/test_htex/test_manager_failure.py,sha256=N-obuSZ8f7XA_XcddoN2LWKSVtpKUZvTHb7BFelS3iQ,1143
349
352
  parsl/tests/test_htex/test_managers_command.py,sha256=Y-eUjtBzwW9erCYdph9bOesbkUvX8QUPqXt27DCgVS8,951
350
353
  parsl/tests/test_htex/test_missing_worker.py,sha256=gyp5i7_t-JHyJGtz_eXZKKBY5w8oqLOIxO6cJgGJMtQ,745
351
354
  parsl/tests/test_htex/test_multiple_disconnected_blocks.py,sha256=Axn8us43dA722O4PWdqxCJM5f_vinZqjFT1WAEvC_ZM,1995
352
355
  parsl/tests/test_htex/test_worker_failure.py,sha256=Uz-RHI-LK78FMjXUvrUFmo4iYfmpDVBUcBxxRb3UG9M,603
353
- parsl/tests/test_htex/test_zmq_binding.py,sha256=Bealo3kRwiu76uwj68bvXH4JNVYUsFtarNKt80f3a04,3757
356
+ parsl/tests/test_htex/test_zmq_binding.py,sha256=BLXJC45qKb8cWbiSJpnzoRI9s0CCmLb1Ex3s92ycanw,3905
354
357
  parsl/tests/test_monitoring/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
355
358
  parsl/tests/test_monitoring/test_app_names.py,sha256=ayyxySGWpKSe9dDw2UeJo1dicxjpALRuLsJfprZV4Eg,2174
356
- parsl/tests/test_monitoring/test_basic.py,sha256=lGyHEJt_rokawv_XeAx-bxV84IlZUFR4KI0PQAiLsFg,3714
359
+ parsl/tests/test_monitoring/test_basic.py,sha256=nQERwVH56CjrKc_YSsMxH5UziJDqN2357Vhyd0brbRU,4177
357
360
  parsl/tests/test_monitoring/test_db_locks.py,sha256=3s3c1xhKo230ZZIJ3f1Ca4U7LcEdXnanOGVXQyNlk2U,2895
358
- parsl/tests/test_monitoring/test_fuzz_zmq.py,sha256=E7T2yEyA_Ti8WxDrGZKya-8m8Hfe9HobVBsCe2BFbKM,3414
361
+ parsl/tests/test_monitoring/test_fuzz_zmq.py,sha256=--3-pQUvXXbkr8v_BEJoPvVvNly1oXvrD2nJh6yl_0M,3436
359
362
  parsl/tests/test_monitoring/test_htex_init_blocks_vs_monitoring.py,sha256=_WjymTgxWvZZwQpJQ3L2gmEt5VUkTss0hOT153AssdQ,2746
360
363
  parsl/tests/test_monitoring/test_incomplete_futures.py,sha256=ZnO1sFSwlWUBHX64C_zwfTVRVC_UFNlU4h0POgx6NEo,2005
361
364
  parsl/tests/test_monitoring/test_memoization_representation.py,sha256=dknv2nO7pNZ1jGxWGsC_AW3rs90gjMIeC5d7pIJ75Xc,2645
@@ -367,7 +370,7 @@ parsl/tests/test_mpi_apps/test_mpi_mode_disabled.py,sha256=Wg3TZE1eF5U3XVGtsCCtt
367
370
  parsl/tests/test_mpi_apps/test_mpi_mode_enabled.py,sha256=pV-htWmPNyY7XKN4Qo-twLmH-qreCgFlYwokgZbTS_g,5304
368
371
  parsl/tests/test_mpi_apps/test_mpi_prefix.py,sha256=yJslZvYK3JeL9UgxMwF9DDPR9QD4zJLGVjubD0F-utc,1950
369
372
  parsl/tests/test_mpi_apps/test_mpi_scheduler.py,sha256=YdV8A-m67DHk9wxgNpj69wwGEKrFGL20KAC1TzLke3c,6332
370
- parsl/tests/test_mpi_apps/test_mpiex.py,sha256=DcvfDZT_WnwSzL5IF71JPbV_wEI_hZl_WrZNBC-QCPE,2032
373
+ parsl/tests/test_mpi_apps/test_mpiex.py,sha256=U4Djvzsf_oKgtxL6HXBxxEzrHiYVw2dQBpDgbGlMffU,2052
371
374
  parsl/tests/test_mpi_apps/test_resource_spec.py,sha256=A7NwNT4LalCSOiHws1ALrrWy8Mn1IItpv9olhnRVjs0,3987
372
375
  parsl/tests/test_providers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
373
376
  parsl/tests/test_providers/test_cobalt_deprecation_warning.py,sha256=UN2W6xJxuLx2euPqArORKFEU2VXez9_PYqq-0rZHanQ,391
@@ -467,13 +470,13 @@ parsl/usage_tracking/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
467
470
  parsl/usage_tracking/api.py,sha256=iaCY58Dc5J4UM7_dJzEEs871P1p1HdxBMtNGyVdzc9g,1821
468
471
  parsl/usage_tracking/levels.py,sha256=xbfzYEsd55KiZJ-mzNgPebvOH4rRHum04hROzEf41tU,291
469
472
  parsl/usage_tracking/usage.py,sha256=qNEJ7nPimqd3Y7OWFLdYmNwJ6XDKlyfV_fTzasxsQw8,8690
470
- parsl-2024.7.22.data/scripts/exec_parsl_function.py,sha256=RUkJ4JSJAjr7YyRZ58zhMdg8cR5dVV9odUl3AuzNf3k,7802
471
- parsl-2024.7.22.data/scripts/interchange.py,sha256=n0aOHLX64DEWx-OA4vWrYRVZfmaz8Rc8haNtafbgh4k,30565
472
- parsl-2024.7.22.data/scripts/parsl_coprocess.py,sha256=zrVjEqQvFOHxsLufPi00xzMONagjVwLZbavPM7bbjK4,5722
473
- parsl-2024.7.22.data/scripts/process_worker_pool.py,sha256=Ar-HLibZxnEVSVanAbOnBFtYdwQ_bSOwXGznoVQIdqI,42977
474
- parsl-2024.7.22.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
475
- parsl-2024.7.22.dist-info/METADATA,sha256=D24HXi2DjCTXBzgd8QBjrkbk97stTxn18dY1_fv9tYM,4124
476
- parsl-2024.7.22.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
477
- parsl-2024.7.22.dist-info/entry_points.txt,sha256=XqnsWDYoEcLbsMcpnYGKLEnSBmaIe1YoM5YsBdJG2tI,176
478
- parsl-2024.7.22.dist-info/top_level.txt,sha256=PIheYoUFQtF2icLsgOykgU-Cjuwr2Oi6On2jo5RYgRM,6
479
- parsl-2024.7.22.dist-info/RECORD,,
473
+ parsl-2024.8.5.data/scripts/exec_parsl_function.py,sha256=RUkJ4JSJAjr7YyRZ58zhMdg8cR5dVV9odUl3AuzNf3k,7802
474
+ parsl-2024.8.5.data/scripts/interchange.py,sha256=47m763R5OTuaWDRPP9JNt4HWWQxgUa_VLGKG3Xy5Jwc,30983
475
+ parsl-2024.8.5.data/scripts/parsl_coprocess.py,sha256=zrVjEqQvFOHxsLufPi00xzMONagjVwLZbavPM7bbjK4,5722
476
+ parsl-2024.8.5.data/scripts/process_worker_pool.py,sha256=78QKnV5KbY_vcteC6k60gpDE4wEk6hsciet_qzs9QoU,43061
477
+ parsl-2024.8.5.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
478
+ parsl-2024.8.5.dist-info/METADATA,sha256=eYZYIdlSdAFvNsgCxzT0xhDvv8Snm02H-7u08RjiSSM,4044
479
+ parsl-2024.8.5.dist-info/WHEEL,sha256=eOLhNAGa2EW3wWl_TU484h7q1UNgy0JXjjoqKoxAAQc,92
480
+ parsl-2024.8.5.dist-info/entry_points.txt,sha256=XqnsWDYoEcLbsMcpnYGKLEnSBmaIe1YoM5YsBdJG2tI,176
481
+ parsl-2024.8.5.dist-info/top_level.txt,sha256=PIheYoUFQtF2icLsgOykgU-Cjuwr2Oi6On2jo5RYgRM,6
482
+ parsl-2024.8.5.dist-info/RECORD,,