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.
- parsl/dataflow/dflow.py +4 -10
- parsl/executors/base.py +8 -8
- parsl/executors/flux/executor.py +7 -7
- parsl/executors/high_throughput/executor.py +55 -55
- parsl/executors/high_throughput/interchange.py +37 -37
- parsl/executors/high_throughput/manager_record.py +1 -0
- parsl/executors/high_throughput/manager_selector.py +25 -0
- parsl/executors/high_throughput/process_worker_pool.py +2 -0
- parsl/executors/status_handling.py +52 -21
- parsl/executors/taskvine/executor.py +0 -18
- parsl/executors/workqueue/executor.py +0 -18
- parsl/monitoring/errors.py +6 -0
- parsl/monitoring/monitoring.py +6 -5
- parsl/monitoring/radios.py +23 -7
- parsl/monitoring/remote.py +12 -12
- parsl/monitoring/router.py +71 -30
- parsl/tests/test_htex/test_disconnected_blocks_failing_provider.py +71 -0
- parsl/tests/test_htex/test_htex.py +28 -19
- parsl/tests/test_htex/test_zmq_binding.py +2 -0
- parsl/tests/test_monitoring/test_basic.py +14 -1
- parsl/tests/test_monitoring/test_fuzz_zmq.py +2 -2
- parsl/tests/test_mpi_apps/test_mpiex.py +1 -1
- parsl/version.py +1 -1
- {parsl-2024.7.22.data → parsl-2024.8.5.data}/scripts/interchange.py +37 -37
- {parsl-2024.7.22.data → parsl-2024.8.5.data}/scripts/process_worker_pool.py +2 -0
- parsl-2024.8.5.dist-info/METADATA +101 -0
- {parsl-2024.7.22.dist-info → parsl-2024.8.5.dist-info}/RECORD +33 -30
- {parsl-2024.7.22.dist-info → parsl-2024.8.5.dist-info}/WHEEL +1 -1
- parsl-2024.7.22.dist-info/METADATA +0 -101
- {parsl-2024.7.22.data → parsl-2024.8.5.data}/scripts/exec_parsl_function.py +0 -0
- {parsl-2024.7.22.data → parsl-2024.8.5.data}/scripts/parsl_coprocess.py +0 -0
- {parsl-2024.7.22.dist-info → parsl-2024.8.5.dist-info}/LICENSE +0 -0
- {parsl-2024.7.22.dist-info → parsl-2024.8.5.dist-info}/entry_points.txt +0 -0
- {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
|
-
|
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
|
119
|
+
assert "Unable to terminate Interchange" in caplog.text
|
120
120
|
assert mock_ix_proc.kill.called
|
121
|
-
assert "Attempting" in
|
122
|
-
assert "Finished" in
|
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
|
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
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
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
@@ -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
|
220
|
-
if
|
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
|
-
|
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
|
-
|
248
|
-
|
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(
|
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("
|
328
|
+
logger.info("Starting main interchange method")
|
334
329
|
|
335
|
-
|
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,
|
367
|
-
self.process_results_incoming(interesting_managers,
|
368
|
-
self.expire_bad_managers(interesting_managers,
|
369
|
-
self.expire_drained_managers(interesting_managers,
|
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
|
-
|
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(
|
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],
|
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(
|
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 =
|
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],
|
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
|
541
|
+
# is not configured, and that monitoring_radio will only
|
542
542
|
# be None when monitoring is not configurated.
|
543
|
-
assert
|
543
|
+
assert monitoring_radio is not None
|
544
544
|
|
545
|
-
|
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],
|
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(
|
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=
|
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=
|
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=
|
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=
|
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=
|
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=
|
84
|
-
parsl/executors/high_throughput/interchange.py,sha256=
|
85
|
-
parsl/executors/high_throughput/manager_record.py,sha256=
|
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=
|
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=
|
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=
|
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=
|
126
|
-
parsl/monitoring/radios.py,sha256=
|
127
|
-
parsl/monitoring/remote.py,sha256=
|
128
|
-
parsl/monitoring/router.py,sha256=
|
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=
|
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=
|
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=
|
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
|
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=
|
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.
|
471
|
-
parsl-2024.
|
472
|
-
parsl-2024.
|
473
|
-
parsl-2024.
|
474
|
-
parsl-2024.
|
475
|
-
parsl-2024.
|
476
|
-
parsl-2024.
|
477
|
-
parsl-2024.
|
478
|
-
parsl-2024.
|
479
|
-
parsl-2024.
|
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,,
|