parsl 2023.10.2__py3-none-any.whl → 2023.10.16__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/benchmark/perf.py +2 -2
- parsl/executors/taskvine/exec_parsl_function.py +20 -25
- parsl/executors/taskvine/executor.py +25 -21
- parsl/executors/taskvine/factory.py +12 -7
- parsl/executors/taskvine/manager.py +7 -5
- parsl/executors/taskvine/manager_config.py +6 -1
- parsl/executors/threads.py +2 -2
- parsl/tests/test_bash_apps/test_error_codes.py +0 -1
- parsl/version.py +1 -1
- {parsl-2023.10.2.dist-info → parsl-2023.10.16.dist-info}/METADATA +2 -2
- {parsl-2023.10.2.dist-info → parsl-2023.10.16.dist-info}/RECORD +18 -19
- parsl/tests/test_docs/test_workflow3.py +0 -23
- {parsl-2023.10.2.data → parsl-2023.10.16.data}/scripts/exec_parsl_function.py +0 -0
- {parsl-2023.10.2.data → parsl-2023.10.16.data}/scripts/parsl_coprocess.py +0 -0
- {parsl-2023.10.2.data → parsl-2023.10.16.data}/scripts/process_worker_pool.py +0 -0
- {parsl-2023.10.2.dist-info → parsl-2023.10.16.dist-info}/LICENSE +0 -0
- {parsl-2023.10.2.dist-info → parsl-2023.10.16.dist-info}/WHEEL +0 -0
- {parsl-2023.10.2.dist-info → parsl-2023.10.16.dist-info}/entry_points.txt +0 -0
- {parsl-2023.10.2.dist-info → parsl-2023.10.16.dist-info}/top_level.txt +0 -0
parsl/benchmark/perf.py
CHANGED
@@ -48,7 +48,7 @@ def performance(*, resources: dict, target_t: float):
|
|
48
48
|
|
49
49
|
submitted_t = time.time()
|
50
50
|
print(f"All {n} tasks submitted ... waiting for completion")
|
51
|
-
print(f"Submission took {submitted_t - start_t:.3f} seconds = {n/(submitted_t - start_t):.3f} tasks/second")
|
51
|
+
print(f"Submission took {submitted_t - start_t:.3f} seconds = {n / (submitted_t - start_t):.3f} tasks/second")
|
52
52
|
|
53
53
|
for f in concurrent.futures.as_completed(fs):
|
54
54
|
assert f.result() == 7
|
@@ -62,7 +62,7 @@ def performance(*, resources: dict, target_t: float):
|
|
62
62
|
print(f"Runtime: actual {delta_t:.3f}s vs target {target_t}s")
|
63
63
|
print(f"Tasks per second: {rate:.3f}")
|
64
64
|
|
65
|
-
n = int(target_t * rate)
|
65
|
+
n = max(1, int(target_t * rate))
|
66
66
|
|
67
67
|
iteration += 1
|
68
68
|
|
@@ -1,13 +1,15 @@
|
|
1
|
-
from parsl.app.errors import RemoteExceptionWrapper
|
2
|
-
from parsl.data_provider.files import File
|
3
|
-
from parsl.utils import get_std_fname_mode
|
4
1
|
import traceback
|
5
2
|
import sys
|
3
|
+
|
6
4
|
import pickle
|
5
|
+
from parsl.app.errors import RemoteExceptionWrapper
|
6
|
+
from parsl.data_provider.files import File
|
7
|
+
from parsl.utils import get_std_fname_mode
|
8
|
+
from parsl.serialize import deserialize
|
7
9
|
|
8
|
-
# This scripts executes a parsl function which is pickled in
|
10
|
+
# This scripts executes a parsl function which is pickled in 4 files:
|
9
11
|
#
|
10
|
-
# exec_parsl_function.py map_file function_file result_file
|
12
|
+
# exec_parsl_function.py map_file function_file argument_file result_file
|
11
13
|
#
|
12
14
|
# map_file: Contains a pickled dictionary that indicates which local_paths the
|
13
15
|
# parsl Files should take.
|
@@ -15,6 +17,8 @@ import pickle
|
|
15
17
|
# function_file: Contains a pickle parsl function. Function might be serialized in advance.
|
16
18
|
# See @parsl.serialize.concretes.py
|
17
19
|
#
|
20
|
+
# argument_file: Contains the serialized arguments to the function call.
|
21
|
+
#
|
18
22
|
# result_file: A file path, whose content will contain the result of the function, including any
|
19
23
|
# exception generated. Exceptions will be wrapped with RemoteExceptionWrapper.
|
20
24
|
#
|
@@ -26,12 +30,6 @@ import pickle
|
|
26
30
|
#
|
27
31
|
|
28
32
|
|
29
|
-
def load_pickled_file(filename: str):
|
30
|
-
""" Load a pickled file and return its pickled object."""
|
31
|
-
with open(filename, "rb") as f_in:
|
32
|
-
return pickle.load(f_in)
|
33
|
-
|
34
|
-
|
35
33
|
def dump_result_to_file(result_file: str, result_package):
|
36
34
|
""" Dump a result to the given result file."""
|
37
35
|
with open(result_file, "wb") as f_out:
|
@@ -78,9 +76,9 @@ def remap_all_files(mapping, fn_args, fn_kwargs):
|
|
78
76
|
remap_location(mapping, maybe_file)
|
79
77
|
|
80
78
|
|
81
|
-
def
|
82
|
-
|
83
|
-
|
79
|
+
def unpack_object_from_file(path):
|
80
|
+
with open(path, 'rb') as f:
|
81
|
+
obj = deserialize(f.read())
|
84
82
|
return obj
|
85
83
|
|
86
84
|
|
@@ -115,26 +113,23 @@ def encode_byte_code_function(user_namespace, fn, fn_name, args_name, kwargs_nam
|
|
115
113
|
def load_function(map_file, function_file, argument_file):
|
116
114
|
# Decodes the function and its file arguments to be executed into
|
117
115
|
# function_code, and updates a user namespace with the function name and
|
118
|
-
# the variable named result_name
|
116
|
+
# the variable named `result_name`. When the function is executed, its result
|
119
117
|
# will be stored in this variable in the user namespace.
|
120
118
|
# Returns (namespace, function_code, result_name)
|
121
119
|
|
122
|
-
|
123
|
-
|
124
|
-
user_ns.update({'__builtins__': __builtins__})
|
125
|
-
|
126
|
-
packed_function = load_pickled_file(function_file)
|
127
|
-
packed_argument = load_pickled_file(argument_file)
|
128
|
-
|
129
|
-
fn = unpack_object(packed_function, user_ns)
|
130
|
-
args_dict = unpack_object(packed_argument, user_ns)
|
120
|
+
fn = unpack_object_from_file(function_file)
|
121
|
+
args_dict = unpack_object_from_file(argument_file)
|
131
122
|
fn_args = args_dict['args']
|
132
123
|
fn_kwargs = args_dict['kwargs']
|
133
124
|
fn_name = 'parsl_tmp_func_name'
|
134
125
|
|
135
|
-
mapping =
|
126
|
+
mapping = unpack_object_from_file(map_file)
|
136
127
|
remap_all_files(mapping, fn_args, fn_kwargs)
|
137
128
|
|
129
|
+
# Create the namespace to isolate the function execution.
|
130
|
+
user_ns = locals()
|
131
|
+
user_ns.update({'__builtins__': __builtins__})
|
132
|
+
|
138
133
|
(code, result_name) = encode_function(user_ns, fn, fn_name, fn_args, fn_kwargs)
|
139
134
|
|
140
135
|
return (user_ns, code, result_name)
|
@@ -11,15 +11,13 @@ import tempfile
|
|
11
11
|
import hashlib
|
12
12
|
import subprocess
|
13
13
|
import os
|
14
|
-
import pickle
|
15
14
|
import queue
|
16
15
|
import inspect
|
17
16
|
import shutil
|
18
17
|
import itertools
|
19
18
|
import uuid
|
20
|
-
from ctypes import c_bool
|
21
19
|
from concurrent.futures import Future
|
22
|
-
from typing import List, Optional, Union
|
20
|
+
from typing import List, Optional, Union, Literal
|
23
21
|
|
24
22
|
# Import Parsl constructs
|
25
23
|
import parsl.utils as putils
|
@@ -71,12 +69,17 @@ class TaskVineExecutor(BlockProviderExecutor, putils.RepresentationMixin):
|
|
71
69
|
with respect to other executors.
|
72
70
|
Default is "TaskVineExecutor".
|
73
71
|
|
74
|
-
worker_launch_method:
|
72
|
+
worker_launch_method: Union[Literal['provider'], Literal['factory'], Literal['manual']]
|
75
73
|
Choose to use Parsl provider, TaskVine factory, or
|
76
74
|
manual user-provided workers to scale workers.
|
77
75
|
Options are among {'provider', 'factory', 'manual'}.
|
78
76
|
Default is 'factory'.
|
79
77
|
|
78
|
+
function_exec_mode: Union[Literal['regular'], Literal['serverless']]
|
79
|
+
Choose to execute functions with a regular fresh python process or a
|
80
|
+
pre-warmed forked python process.
|
81
|
+
Default is 'regular'.
|
82
|
+
|
80
83
|
manager_config: TaskVineManagerConfig
|
81
84
|
Configuration for the TaskVine manager. Default
|
82
85
|
|
@@ -98,7 +101,8 @@ class TaskVineExecutor(BlockProviderExecutor, putils.RepresentationMixin):
|
|
98
101
|
@typeguard.typechecked
|
99
102
|
def __init__(self,
|
100
103
|
label: str = "TaskVineExecutor",
|
101
|
-
worker_launch_method:
|
104
|
+
worker_launch_method: Union[Literal['provider'], Literal['factory'], Literal['manual']] = 'factory',
|
105
|
+
function_exec_mode: Union[Literal['regular'], Literal['serverless']] = 'regular',
|
102
106
|
manager_config: TaskVineManagerConfig = TaskVineManagerConfig(),
|
103
107
|
factory_config: TaskVineFactoryConfig = TaskVineFactoryConfig(),
|
104
108
|
provider: Optional[ExecutionProvider] = LocalProvider(init_blocks=1),
|
@@ -107,9 +111,6 @@ class TaskVineExecutor(BlockProviderExecutor, putils.RepresentationMixin):
|
|
107
111
|
# Set worker launch option for this executor
|
108
112
|
if worker_launch_method == 'factory' or worker_launch_method == 'manual':
|
109
113
|
provider = None
|
110
|
-
elif worker_launch_method != 'provider':
|
111
|
-
raise ExecutorError(self, "Worker launch option '{worker_launch_method}' \
|
112
|
-
is not supported.")
|
113
114
|
|
114
115
|
# Initialize the parent class with the execution provider and block error handling enabled.
|
115
116
|
# If provider is None, then no worker is launched via the provider method.
|
@@ -126,6 +127,7 @@ class TaskVineExecutor(BlockProviderExecutor, putils.RepresentationMixin):
|
|
126
127
|
# Executor configurations
|
127
128
|
self.label = label
|
128
129
|
self.worker_launch_method = worker_launch_method
|
130
|
+
self.function_exec_mode = function_exec_mode
|
129
131
|
self.manager_config = manager_config
|
130
132
|
self.factory_config = factory_config
|
131
133
|
self.storage_access = storage_access
|
@@ -136,8 +138,8 @@ class TaskVineExecutor(BlockProviderExecutor, putils.RepresentationMixin):
|
|
136
138
|
# Queue to send finished tasks from TaskVine manager process to TaskVine executor process
|
137
139
|
self._finished_task_queue: multiprocessing.Queue = multiprocessing.Queue()
|
138
140
|
|
139
|
-
#
|
140
|
-
self._should_stop = multiprocessing.
|
141
|
+
# Event to signal whether the manager and factory processes should stop running
|
142
|
+
self._should_stop = multiprocessing.Event()
|
141
143
|
|
142
144
|
# TaskVine manager process
|
143
145
|
self._submit_process = None
|
@@ -267,10 +269,11 @@ class TaskVineExecutor(BlockProviderExecutor, putils.RepresentationMixin):
|
|
267
269
|
# Begin work
|
268
270
|
self._submit_process.start()
|
269
271
|
|
270
|
-
# Run worker scaler either with Parsl provider or TaskVine factory
|
272
|
+
# Run worker scaler either with Parsl provider or TaskVine factory.
|
273
|
+
# Skip if workers are launched manually.
|
271
274
|
if self.worker_launch_method == 'factory':
|
272
275
|
self._factory_process.start()
|
273
|
-
|
276
|
+
elif self.worker_launch_method == 'provider':
|
274
277
|
self.initialize_scaling()
|
275
278
|
|
276
279
|
self._collector_thread.start()
|
@@ -314,7 +317,7 @@ class TaskVineExecutor(BlockProviderExecutor, putils.RepresentationMixin):
|
|
314
317
|
logger.debug(f'Got resource specification: {resource_specification}')
|
315
318
|
|
316
319
|
# Default execution mode of apps is regular
|
317
|
-
exec_mode = resource_specification.get('exec_mode',
|
320
|
+
exec_mode = resource_specification.get('exec_mode', self.function_exec_mode)
|
318
321
|
|
319
322
|
# Detect resources and features of a submitted Parsl app
|
320
323
|
cores = None
|
@@ -391,9 +394,9 @@ class TaskVineExecutor(BlockProviderExecutor, putils.RepresentationMixin):
|
|
391
394
|
and result to be found at: {}".format(executor_task_id, function_file, argument_file, result_file))
|
392
395
|
|
393
396
|
# Serialize function object and arguments, separately
|
394
|
-
self.
|
397
|
+
self._serialize_object_to_file(function_file, func)
|
395
398
|
args_dict = {'args': args, 'kwargs': kwargs}
|
396
|
-
self.
|
399
|
+
self._serialize_object_to_file(argument_file, args_dict)
|
397
400
|
|
398
401
|
# Construct the map file of local filenames at worker
|
399
402
|
self._construct_map_file(map_file, input_files, output_files)
|
@@ -466,11 +469,13 @@ class TaskVineExecutor(BlockProviderExecutor, putils.RepresentationMixin):
|
|
466
469
|
if self.project_password_file:
|
467
470
|
self.provider.transfer_input_files.append(self.project_password_file)
|
468
471
|
|
469
|
-
def
|
472
|
+
def _serialize_object_to_file(self, path, obj):
|
470
473
|
"""Takes any object and serializes it to the file path."""
|
471
474
|
serialized_obj = serialize(obj, buffer_threshold=1024 * 1024)
|
472
475
|
with open(path, 'wb') as f_out:
|
473
|
-
|
476
|
+
written = 0
|
477
|
+
while written < len(serialized_obj):
|
478
|
+
written += f_out.write(serialized_obj[written:])
|
474
479
|
|
475
480
|
def _construct_map_file(self, map_file, input_files, output_files):
|
476
481
|
""" Map local filepath of parsl files to the filenames at the execution worker.
|
@@ -485,8 +490,7 @@ class TaskVineExecutor(BlockProviderExecutor, putils.RepresentationMixin):
|
|
485
490
|
else:
|
486
491
|
remote_name = local_name
|
487
492
|
file_translation_map[local_name] = remote_name
|
488
|
-
|
489
|
-
pickle.dump(file_translation_map, f_out)
|
493
|
+
self._serialize_object_to_file(map_file, file_translation_map)
|
490
494
|
|
491
495
|
def _register_file(self, parsl_file):
|
492
496
|
"""Generates a tuple (parsl_file.filepath, stage, cache) to give to
|
@@ -592,7 +596,7 @@ class TaskVineExecutor(BlockProviderExecutor, putils.RepresentationMixin):
|
|
592
596
|
collector thread, which shuts down the TaskVine system submission.
|
593
597
|
"""
|
594
598
|
logger.debug("TaskVine shutdown started")
|
595
|
-
self._should_stop.
|
599
|
+
self._should_stop.set()
|
596
600
|
|
597
601
|
# Remove the workers that are still going
|
598
602
|
kill_ids = [self.blocks[block] for block in self.blocks.keys()]
|
@@ -618,7 +622,7 @@ class TaskVineExecutor(BlockProviderExecutor, putils.RepresentationMixin):
|
|
618
622
|
"""
|
619
623
|
logger.debug("Starting Collector Thread")
|
620
624
|
try:
|
621
|
-
while not self._should_stop.
|
625
|
+
while not self._should_stop.is_set():
|
622
626
|
if not self._submit_process.is_alive():
|
623
627
|
raise ExecutorError(self, "taskvine Submit Process is not alive")
|
624
628
|
|
@@ -1,16 +1,24 @@
|
|
1
1
|
import logging
|
2
|
-
import time
|
3
2
|
|
4
3
|
from parsl.process_loggers import wrap_with_logs
|
5
4
|
from parsl.executors.taskvine.errors import TaskVineFactoryFailure
|
6
5
|
|
7
|
-
|
6
|
+
# This try except clause prevents import errors
|
7
|
+
# when TaskVine is not used in Parsl.
|
8
|
+
try:
|
9
|
+
from ndcctools.taskvine import Factory
|
10
|
+
taskvine_available = True
|
11
|
+
except ImportError:
|
12
|
+
taskvine_available = False
|
8
13
|
|
9
14
|
logger = logging.getLogger(__name__)
|
10
15
|
|
11
16
|
|
12
17
|
@wrap_with_logs
|
13
18
|
def _taskvine_factory(should_stop, factory_config):
|
19
|
+
if not taskvine_available:
|
20
|
+
logger.debug("TaskVine package cannot be found. Please install the ndcctools package.")
|
21
|
+
return
|
14
22
|
logger.debug("Starting TaskVine factory process")
|
15
23
|
|
16
24
|
try:
|
@@ -54,11 +62,8 @@ def _taskvine_factory(should_stop, factory_config):
|
|
54
62
|
if factory_config.batch_options:
|
55
63
|
factory.batch_options = factory_config.batch_options
|
56
64
|
|
57
|
-
#
|
58
|
-
# avoid wasting CPU
|
65
|
+
# run factory through Python context and wait for signal to stop.
|
59
66
|
with factory:
|
60
|
-
|
61
|
-
time.sleep(1)
|
67
|
+
should_stop.wait()
|
62
68
|
|
63
69
|
logger.debug("Exiting TaskVine factory process")
|
64
|
-
return 0
|
@@ -106,6 +106,8 @@ def _prepare_environment_regular(m, manager_config, t, task, poncho_env_to_file,
|
|
106
106
|
env_tarball = str(uuid.uuid4()) + '.tar.gz'
|
107
107
|
logger.debug(f'Creating a poncho environment at {env_tarball} from conda environment {manager_config.env_pack}')
|
108
108
|
subprocess.run([poncho_create_script, manager_config.env_pack, env_tarball], stdout=subprocess.DEVNULL, check=True)
|
109
|
+
else:
|
110
|
+
env_tarball = manager_config.env_pack
|
109
111
|
poncho_env_file = m.declare_poncho(env_tarball, cache=True, peer_transfer=True)
|
110
112
|
poncho_env_to_file[manager_config.env_pack] = poncho_env_file
|
111
113
|
else:
|
@@ -194,15 +196,15 @@ def _taskvine_submit_wait(ready_task_queue=None,
|
|
194
196
|
|
195
197
|
logger.debug("Entering main loop of TaskVine manager")
|
196
198
|
|
197
|
-
while not should_stop.
|
198
|
-
#
|
199
|
+
while not should_stop.is_set():
|
200
|
+
# Check if executor process is still running
|
199
201
|
ppid = os.getppid()
|
200
202
|
if ppid != orig_ppid:
|
201
|
-
logger.debug("
|
203
|
+
logger.debug("Executor process is detected to have exited. Exiting..")
|
202
204
|
break
|
203
205
|
|
204
206
|
# Submit tasks
|
205
|
-
while ready_task_queue.qsize() > 0 and not should_stop.
|
207
|
+
while ready_task_queue.qsize() > 0 and not should_stop.is_set():
|
206
208
|
# Obtain task from ready_task_queue
|
207
209
|
try:
|
208
210
|
task = ready_task_queue.get(timeout=1)
|
@@ -377,7 +379,7 @@ def _taskvine_submit_wait(ready_task_queue=None,
|
|
377
379
|
# If the queue is not empty wait on the TaskVine queue for a task
|
378
380
|
task_found = True
|
379
381
|
if not m.empty():
|
380
|
-
while task_found and not should_stop.
|
382
|
+
while task_found and not should_stop.is_set():
|
381
383
|
# Obtain the task from the queue
|
382
384
|
t = m.wait(1)
|
383
385
|
if t is None:
|
@@ -2,7 +2,12 @@ import socket
|
|
2
2
|
from dataclasses import dataclass
|
3
3
|
from typing import Optional
|
4
4
|
|
5
|
-
|
5
|
+
# This try except clause prevents import errors
|
6
|
+
# when TaskVine is not used in Parsl.
|
7
|
+
try:
|
8
|
+
from ndcctools.taskvine.cvine import VINE_DEFAULT_PORT
|
9
|
+
except ImportError:
|
10
|
+
VINE_DEFAULT_PORT = 0 # use any available port.
|
6
11
|
|
7
12
|
|
8
13
|
@dataclass
|
parsl/executors/threads.py
CHANGED
@@ -18,7 +18,7 @@ class ThreadPoolExecutor(ParslExecutor, RepresentationMixin):
|
|
18
18
|
|
19
19
|
Parameters
|
20
20
|
----------
|
21
|
-
max_threads : int
|
21
|
+
max_threads : Optional[int]
|
22
22
|
Number of threads. Default is 2.
|
23
23
|
thread_name_prefix : string
|
24
24
|
Thread name prefix
|
@@ -27,7 +27,7 @@ class ThreadPoolExecutor(ParslExecutor, RepresentationMixin):
|
|
27
27
|
"""
|
28
28
|
|
29
29
|
@typeguard.typechecked
|
30
|
-
def __init__(self, label: str = 'threads', max_threads: int = 2,
|
30
|
+
def __init__(self, label: str = 'threads', max_threads: Optional[int] = 2,
|
31
31
|
thread_name_prefix: str = '', storage_access: Optional[List[Staging]] = None,
|
32
32
|
working_dir: Optional[str] = None):
|
33
33
|
ParslExecutor.__init__(self)
|
parsl/version.py
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: parsl
|
3
|
-
Version: 2023.10.
|
3
|
+
Version: 2023.10.16
|
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/2023.10.
|
6
|
+
Download-URL: https://github.com/Parsl/parsl/archive/2023.10.16.tar.gz
|
7
7
|
Author: The Parsl Team
|
8
8
|
Author-email: parsl@googlegroups.com
|
9
9
|
License: Apache 2.0
|
@@ -7,7 +7,7 @@ parsl/multiprocessing.py,sha256=uY64wcQmWt2rgylQm4lmr3HE8AxwFGeQQj4l1jKnnrY,1970
|
|
7
7
|
parsl/process_loggers.py,sha256=1G3Rfrh5wuZNo2X03grG4kTYPGOxz7hHCyG6L_A3b0A,1137
|
8
8
|
parsl/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
9
9
|
parsl/utils.py,sha256=OEypbWrcq6ThjARS9BfpJ7Aippawc92fYnume19ILjQ,11604
|
10
|
-
parsl/version.py,sha256=
|
10
|
+
parsl/version.py,sha256=dX--2QfwTD1tOKaQdlh7juYDbKCuXVBWObq1S7FxF_w,131
|
11
11
|
parsl/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
12
12
|
parsl/app/app.py,sha256=8hCd_ZXnyVMrC1wdVebBXwszChDT41Dbz2yJTGLgOLE,8103
|
13
13
|
parsl/app/bash.py,sha256=bx9x1XFwkOTpZZD3CPwnVL9SyNRDjbUGtOnuGLvxN_8,5396
|
@@ -15,7 +15,7 @@ parsl/app/errors.py,sha256=ufT4THs2DsffHk1GO6Zm6-ecfskyNAzZ6toNoq2nI0c,4112
|
|
15
15
|
parsl/app/futures.py,sha256=42UucIjKLJyRkg59BH-Pg_Q9Iue2Y-LSDi6g8q_cKzo,2910
|
16
16
|
parsl/app/python.py,sha256=qzVq7aXu3ZQGsMdQGDDYov_AP7ChvUT00peqIM93XXA,2330
|
17
17
|
parsl/benchmark/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
18
|
-
parsl/benchmark/perf.py,sha256=
|
18
|
+
parsl/benchmark/perf.py,sha256=ukpJrA5IBy5umsZ5Itw4YenVzxCf4zGXYHCf2IHwYoc,2828
|
19
19
|
parsl/channels/__init__.py,sha256=x-GGbnZJXpQJ5eNQNb0UmCCqAnYiBqk0aJKDtqrkMBM,371
|
20
20
|
parsl/channels/base.py,sha256=uaDVLbkcS3rR5ZSZZETyF4KqpI_Y8A_128tLYWT40Q0,4782
|
21
21
|
parsl/channels/errors.py,sha256=Pr7TS5jbE3BXAdrq9ZuV5NprZG4_3sHgifa9E3oEkVE,3345
|
@@ -73,7 +73,7 @@ parsl/executors/__init__.py,sha256=J50N97Nm9YRjz6K0oNXDxUYIsDjL43_tp3LVb2w7n-M,3
|
|
73
73
|
parsl/executors/base.py,sha256=ymUsBZ9qG8rrTYwTXYeuBunQY00yBZRGnIpMaFEFcJI,4367
|
74
74
|
parsl/executors/errors.py,sha256=xVswxgi7vmJcUMCeYDAPK8sQT2kHFFROVoOr0dnmcWE,2098
|
75
75
|
parsl/executors/status_handling.py,sha256=bn1AQJPP16sA8sgWQYSSsOB_ZahsOenGnD_XpXBPyE8,10966
|
76
|
-
parsl/executors/threads.py,sha256=
|
76
|
+
parsl/executors/threads.py,sha256=0LyVFB4-a4t7y84rWvjx343DZIKH1V7G4PcSNeG83WU,3374
|
77
77
|
parsl/executors/flux/__init__.py,sha256=P9grTTeRPXfqXurFhlSS7XhmE6tTbnCnyQ1f9b-oYHE,136
|
78
78
|
parsl/executors/flux/execute_parsl_task.py,sha256=yUG_WjZLcX8LrgPl26mpEBWZhQMlVNbRLGu08yIjdf4,1553
|
79
79
|
parsl/executors/flux/executor.py,sha256=tf9xPmWgEsgEjzs89dJ-sMx-QaqRpM1R1crX3tp0-Oc,16893
|
@@ -89,12 +89,12 @@ parsl/executors/high_throughput/process_worker_pool.py,sha256=b2xsV0QHEMbYQXhVYb
|
|
89
89
|
parsl/executors/high_throughput/zmq_pipes.py,sha256=yTURJSHGY-n1rI5OfzJbcTa1Ji7jiY8nuisqBWgpEZw,5720
|
90
90
|
parsl/executors/taskvine/__init__.py,sha256=sWIJdvSLgQKul9dlSjIkNat7yBDgU3SrBF3X2yhT86E,293
|
91
91
|
parsl/executors/taskvine/errors.py,sha256=MNS_NjpvHjwevQXOjqjSEBFroqEWi-LT1ZEVZ2C5Dx0,652
|
92
|
-
parsl/executors/taskvine/exec_parsl_function.py,sha256=
|
93
|
-
parsl/executors/taskvine/executor.py,sha256=
|
94
|
-
parsl/executors/taskvine/factory.py,sha256=
|
92
|
+
parsl/executors/taskvine/exec_parsl_function.py,sha256=udSmN99FGdOT0nSjFpEYNi1r2NWADDvGC4goAHLum3Y,7100
|
93
|
+
parsl/executors/taskvine/executor.py,sha256=R6mr2zkSS9ujEpV_K7crkzptEOGvM_cRpyejukDaM50,30578
|
94
|
+
parsl/executors/taskvine/factory.py,sha256=ShlaS5h3taEpAnVNIlfXM9EO49BsN1BRNLHGYKMjVXo,2637
|
95
95
|
parsl/executors/taskvine/factory_config.py,sha256=AbE2fN2snrF5ITYrrS4DnGn2XkJHUFr_17DYHDHIwq0,3693
|
96
|
-
parsl/executors/taskvine/manager.py,sha256=
|
97
|
-
parsl/executors/taskvine/manager_config.py,sha256=
|
96
|
+
parsl/executors/taskvine/manager.py,sha256=l2lVSuFS6_VDDADtrPwg12-pTSkZ2qxlraMNC6qIIx0,25067
|
97
|
+
parsl/executors/taskvine/manager_config.py,sha256=BuBVBlMioL6A-nPhJ2fy12vZO1K4UQ7n8QCP6rfE1A8,6604
|
98
98
|
parsl/executors/taskvine/utils.py,sha256=l492wEYPRw63DkAy-9gkUP3f5a_2pp4F3RmbM8f8BzM,4105
|
99
99
|
parsl/executors/workqueue/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
100
100
|
parsl/executors/workqueue/errors.py,sha256=cViEm971bK2UVlDk4PUsSJd692aka9dgwwRbI3nypIs,471
|
@@ -285,7 +285,7 @@ parsl/tests/sites/test_mpi/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJ
|
|
285
285
|
parsl/tests/test_bash_apps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
286
286
|
parsl/tests/test_bash_apps/test_apptimeout.py,sha256=fZP7LMSuRtiP1dp1viAWbH5cTfA5otPLsW-KksBAQaU,570
|
287
287
|
parsl/tests/test_bash_apps/test_basic.py,sha256=R8J8gzZ1Dyw_2r4zmKmPVBBPIt2At9JDB5kfW8VcAjI,2385
|
288
|
-
parsl/tests/test_bash_apps/test_error_codes.py,sha256=
|
288
|
+
parsl/tests/test_bash_apps/test_error_codes.py,sha256=k6EDbPbP8yKsHb7mPcppoBn5zN33fT2vH3CjPahdD9A,4030
|
289
289
|
parsl/tests/test_bash_apps/test_keyword_overlaps.py,sha256=8bfN2qw4uXJsYquppR1lZQrYW834AZc3zjYIIHTfDoE,209
|
290
290
|
parsl/tests/test_bash_apps/test_kwarg_storage.py,sha256=54fbr6uCde_RmjzOpIXzZoBL_ByN2MzUidk5XEBJxS4,742
|
291
291
|
parsl/tests/test_bash_apps/test_memoize.py,sha256=vDUinqnGAYHA4esWjj1gg6WV6UyIBFjRl9ClnPFtXCk,1427
|
@@ -315,7 +315,6 @@ parsl/tests/test_docs/test_from_slides.py,sha256=0qJHAsSN3eqn4LAFTyCAq1rIUOotBzy
|
|
315
315
|
parsl/tests/test_docs/test_tutorial_1.py,sha256=leY0mpZz8_BGhPCai7FOVMGhUtv_yeYabAXgghA_DxI,1438
|
316
316
|
parsl/tests/test_docs/test_workflow1.py,sha256=icOXUfSLM_ljekoM5jXu3Kr0Yg2vLoiYj5lh_Sb22Xk,976
|
317
317
|
parsl/tests/test_docs/test_workflow2.py,sha256=ZcDFZDq-VbWcX1-QF07FNOYVDEv9te61ayTc5o2psQ4,1150
|
318
|
-
parsl/tests/test_docs/test_workflow3.py,sha256=cyJ4pO1XaLAWZS-Gpso-yBudmXHbGd1BvEDcxZ7uvrg,558
|
319
318
|
parsl/tests/test_docs/test_workflow4.py,sha256=PfOVDx5v_NtwDvg-ccC3A3SVM-SF0Pcybx2c7BF9Jdw,1159
|
320
319
|
parsl/tests/test_error_handling/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
321
320
|
parsl/tests/test_error_handling/test_fail.py,sha256=xx4TGWfL7le4cQ9nvnUkrlmKQJkskhD0l_3W1xwZSEI,282
|
@@ -403,12 +402,12 @@ parsl/tests/test_threads/test_configs.py,sha256=QA9YjIMAtZ2jmkfOWqBzEfzQQcFVCDiz
|
|
403
402
|
parsl/tests/test_threads/test_lazy_errors.py,sha256=nGhYfCMHFZYSy6YJ4gnAmiLl9SfYs0WVnuvj8DXQ9bw,560
|
404
403
|
parsl/usage_tracking/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
405
404
|
parsl/usage_tracking/usage.py,sha256=TEuAIm_U_G2ojZxvd0bbVa6gZlU61_mVRa2yJC9mGiI,7555
|
406
|
-
parsl-2023.10.
|
407
|
-
parsl-2023.10.
|
408
|
-
parsl-2023.10.
|
409
|
-
parsl-2023.10.
|
410
|
-
parsl-2023.10.
|
411
|
-
parsl-2023.10.
|
412
|
-
parsl-2023.10.
|
413
|
-
parsl-2023.10.
|
414
|
-
parsl-2023.10.
|
405
|
+
parsl-2023.10.16.data/scripts/exec_parsl_function.py,sha256=kYJmpgsswNMqV2-_dOmtgZHhb9OuKMvB-UwaNO2A2z0,7759
|
406
|
+
parsl-2023.10.16.data/scripts/parsl_coprocess.py,sha256=V5yr9c-DvZHaBPvJOUsaAxJo2s1-ZsJqO1EhauYQd2A,5499
|
407
|
+
parsl-2023.10.16.data/scripts/process_worker_pool.py,sha256=wWYHy0FF0NqZ2y45UJJ8Omq0ryEVWlQQxIAeJhoGjTs,32983
|
408
|
+
parsl-2023.10.16.dist-info/LICENSE,sha256=tAkwu8-AdEyGxGoSvJ2gVmQdcicWw3j1ZZueVV74M-E,11357
|
409
|
+
parsl-2023.10.16.dist-info/METADATA,sha256=BUnMvEIL2XWEJ2RTQUT8unv-6pW4knZohqKwvcMGd_0,3635
|
410
|
+
parsl-2023.10.16.dist-info/WHEEL,sha256=yQN5g4mg4AybRjkgi-9yy4iQEFibGQmlz78Pik5Or-A,92
|
411
|
+
parsl-2023.10.16.dist-info/entry_points.txt,sha256=XqnsWDYoEcLbsMcpnYGKLEnSBmaIe1YoM5YsBdJG2tI,176
|
412
|
+
parsl-2023.10.16.dist-info/top_level.txt,sha256=PIheYoUFQtF2icLsgOykgU-Cjuwr2Oi6On2jo5RYgRM,6
|
413
|
+
parsl-2023.10.16.dist-info/RECORD,,
|
@@ -1,23 +0,0 @@
|
|
1
|
-
import parsl
|
2
|
-
|
3
|
-
from parsl.app.app import python_app
|
4
|
-
from parsl.tests.configs.local_threads import config
|
5
|
-
|
6
|
-
|
7
|
-
@python_app
|
8
|
-
def generate(limit):
|
9
|
-
from random import randint
|
10
|
-
"""Generate a random integer and return it"""
|
11
|
-
return randint(1, limit)
|
12
|
-
|
13
|
-
|
14
|
-
def test_parallel_for(N=2):
|
15
|
-
"""Test parallel workflows from docs on Composing workflows
|
16
|
-
"""
|
17
|
-
rand_nums = []
|
18
|
-
for i in range(1, 5):
|
19
|
-
rand_nums.append(generate(i))
|
20
|
-
|
21
|
-
# wait for all apps to finish and collect the results
|
22
|
-
outputs = [i.result() for i in rand_nums]
|
23
|
-
return outputs
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|