dv-flow-mgr 0.0.1.12919555073a1__py3-none-any.whl → 0.0.1.12931082290a1__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.
- dv_flow/mgr/package_def.py +1 -1
- dv_flow/mgr/task.py +12 -53
- dv_flow/mgr/task_graph_builder.py +7 -7
- dv_flow/mgr/task_graph_runner_local.py +58 -8
- {dv_flow_mgr-0.0.1.12919555073a1.dist-info → dv_flow_mgr-0.0.1.12931082290a1.dist-info}/METADATA +1 -1
- {dv_flow_mgr-0.0.1.12919555073a1.dist-info → dv_flow_mgr-0.0.1.12931082290a1.dist-info}/RECORD +10 -10
- {dv_flow_mgr-0.0.1.12919555073a1.dist-info → dv_flow_mgr-0.0.1.12931082290a1.dist-info}/LICENSE +0 -0
- {dv_flow_mgr-0.0.1.12919555073a1.dist-info → dv_flow_mgr-0.0.1.12931082290a1.dist-info}/WHEEL +0 -0
- {dv_flow_mgr-0.0.1.12919555073a1.dist-info → dv_flow_mgr-0.0.1.12931082290a1.dist-info}/entry_points.txt +0 -0
- {dv_flow_mgr-0.0.1.12919555073a1.dist-info → dv_flow_mgr-0.0.1.12931082290a1.dist-info}/top_level.txt +0 -0
dv_flow/mgr/package_def.py
CHANGED
dv_flow/mgr/task.py
CHANGED
@@ -68,12 +68,8 @@ class Task(object):
|
|
68
68
|
session : 'TaskGraphRunner' = None
|
69
69
|
basedir : str = None
|
70
70
|
memento : TaskMemento = None
|
71
|
-
|
72
|
-
depends : List[int] = dc.field(default_factory=list)
|
73
|
-
running : bool = False
|
74
|
-
output_set : bool = False
|
71
|
+
depends : List['Task'] = dc.field(default_factory=list)
|
75
72
|
output : Any = None
|
76
|
-
output_ev : Any = asyncio.Event()
|
77
73
|
|
78
74
|
# Implementation data below
|
79
75
|
basedir : str = dc.field(default=None)
|
@@ -107,23 +103,16 @@ class Task(object):
|
|
107
103
|
async def do_run(self) -> TaskData:
|
108
104
|
print("do_run: %s - %d depends" % (self.name, len(self.depends)))
|
109
105
|
if len(self.depends) > 0:
|
110
|
-
|
111
|
-
|
106
|
+
deps_o = []
|
107
|
+
for d in self.depends:
|
108
|
+
dep_o = d.getOutput()
|
109
|
+
if dep_o is None:
|
110
|
+
raise Exception("Null output for %s" % d.name)
|
111
|
+
deps_o.append(dep_o)
|
112
112
|
|
113
113
|
# Merge filesets. A fileset with the same
|
114
114
|
print("deps_o: %s" % str(deps_o))
|
115
115
|
|
116
|
-
|
117
|
-
# print("deps_m: %s" % str(deps_m))
|
118
|
-
|
119
|
-
# Merge the output of the dependencies into a single input data
|
120
|
-
# if len(self.depends) > 1:
|
121
|
-
# raise Exception("TODO: handle >1 inputs")
|
122
|
-
|
123
|
-
# Now that we have a clean input object, we need
|
124
|
-
# to build the dep map
|
125
|
-
|
126
|
-
# input = self.depends[0].output.copy()
|
127
116
|
input = TaskData.merge(deps_o)
|
128
117
|
input.src = self.name
|
129
118
|
input.deps[self.name] = list(inp.name for inp in self.depends)
|
@@ -137,29 +126,17 @@ class Task(object):
|
|
137
126
|
|
138
127
|
self.init_rundir()
|
139
128
|
|
140
|
-
|
141
|
-
|
142
|
-
if not self.output_set:
|
143
|
-
if result is None:
|
144
|
-
result = TaskData()
|
129
|
+
self.output = await self.run(input)
|
145
130
|
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
# result.deps.append(dep_o.clone())
|
150
|
-
|
151
|
-
self.setOutput(result)
|
152
|
-
else:
|
153
|
-
# The task has taken control of the output
|
154
|
-
result = self.getOutput()
|
131
|
+
if self.output is None:
|
132
|
+
raise Exception("No output produced by %s" % self.name)
|
133
|
+
result = TaskData()
|
155
134
|
|
156
135
|
# Write-back the memento, if specified
|
157
136
|
self.save_memento()
|
158
137
|
|
159
|
-
self.running = False
|
160
|
-
|
161
138
|
# Combine data from the deps to produce a result
|
162
|
-
return
|
139
|
+
return self.output
|
163
140
|
|
164
141
|
async def run(self, input : TaskData) -> TaskData:
|
165
142
|
raise NotImplementedError("TaskImpl.run() not implemented")
|
@@ -173,24 +150,6 @@ class Task(object):
|
|
173
150
|
with open(os.path.join(self.rundir, "memento.json"), "w") as fp:
|
174
151
|
fp.write(self.memento.model_dump_json(indent=2))
|
175
152
|
|
176
|
-
def setOutput(self, output : TaskData):
|
177
|
-
self.output_set = True
|
178
|
-
output.src = self.name
|
179
|
-
self.output = output
|
180
|
-
self.output_ev.set()
|
181
|
-
|
182
|
-
async def waitOutput(self) -> TaskData:
|
183
|
-
if not self.output_set:
|
184
|
-
if self.running:
|
185
|
-
# Task is already running
|
186
|
-
print("wait")
|
187
|
-
await self.output_ev.wait()
|
188
|
-
else:
|
189
|
-
self.running = True
|
190
|
-
print("start task")
|
191
|
-
await self.do_run()
|
192
|
-
return self.output
|
193
|
-
|
194
153
|
def getOutput(self) -> TaskData:
|
195
154
|
return self.output
|
196
155
|
|
@@ -70,6 +70,13 @@ class TaskGraphBuilder(object):
|
|
70
70
|
|
71
71
|
depends = []
|
72
72
|
|
73
|
+
for dep in ctor_t.depends:
|
74
|
+
if not dep in self._task_m.keys():
|
75
|
+
task = self._mkTaskGraph(dep, rundir)
|
76
|
+
self._task_m[dep] = task
|
77
|
+
pass
|
78
|
+
depends.append(self._task_m[dep])
|
79
|
+
|
73
80
|
# The returned task should have all param references resolved
|
74
81
|
print("task_ctor=%s" % str(ctor_t.task_ctor), flush=True)
|
75
82
|
task = ctor_t.task_ctor(
|
@@ -80,13 +87,6 @@ class TaskGraphBuilder(object):
|
|
80
87
|
rundir=rundir,
|
81
88
|
srcdir=ctor_t.srcdir)
|
82
89
|
|
83
|
-
for i,d in enumerate(task.depend_refs):
|
84
|
-
if d in self._task_m.keys():
|
85
|
-
task.depends.append(self._task_m[d])
|
86
|
-
else:
|
87
|
-
print("mkTaskGraph: %s" % d)
|
88
|
-
task.depends.append(self._mkTaskGraph(d, parent_rundir))
|
89
|
-
|
90
90
|
self._task_m[task.name] = task
|
91
91
|
|
92
92
|
self._pkg_s.pop()
|
@@ -23,7 +23,8 @@ import asyncio
|
|
23
23
|
import os
|
24
24
|
import yaml
|
25
25
|
import dataclasses as dc
|
26
|
-
from
|
26
|
+
from toposort import toposort
|
27
|
+
from typing import Any, Callable, ClassVar, Coroutine, Dict, List, Tuple, Union
|
27
28
|
from .fragment_def import FragmentDef
|
28
29
|
from .package import Package
|
29
30
|
from .pkg_rgy import PkgRgy
|
@@ -37,7 +38,8 @@ class TaskGraphRunnerLocal(TaskGraphRunner):
|
|
37
38
|
"""Session manages execution of a task graph"""
|
38
39
|
|
39
40
|
rundir : str
|
40
|
-
nproc : int =
|
41
|
+
nproc : int = 4
|
42
|
+
done_task_m : Dict = dc.field(default_factory=dict)
|
41
43
|
_workers : List = dc.field(default_factory=list)
|
42
44
|
|
43
45
|
_inst : ClassVar['TaskGraphRunner'] = None
|
@@ -62,15 +64,62 @@ class TaskGraphRunnerLocal(TaskGraphRunner):
|
|
62
64
|
task = [task]
|
63
65
|
else:
|
64
66
|
unwrap = False
|
65
|
-
|
66
|
-
run_o = list(t.do_run() for t in task)
|
67
67
|
|
68
|
-
|
68
|
+
dep_m = {}
|
69
|
+
task_m = {}
|
70
|
+
|
71
|
+
for t in task:
|
72
|
+
self._mkDeps(dep_m, task_m, t)
|
73
|
+
|
74
|
+
print("dep_m: %s" % str(dep_m))
|
75
|
+
|
76
|
+
order = list(toposort(dep_m))
|
77
|
+
|
78
|
+
active_task_l : List[Tuple[Task,Coroutine]]= []
|
79
|
+
# Now, iterate over the concurrent sets
|
80
|
+
for active_s in order:
|
81
|
+
|
82
|
+
# Check to see if all tasks are complete
|
83
|
+
done = True
|
84
|
+
for t in active_s:
|
85
|
+
while len(active_task_l) >= self.nproc and t not in self.done_task_m.keys():
|
86
|
+
# Wait for at least one job to complete
|
87
|
+
done, pending = await asyncio.wait(at[1] for at in active_task_l)
|
88
|
+
for d in done:
|
89
|
+
for i in range(len(active_task_l)):
|
90
|
+
if active_task_l[i][1] == d:
|
91
|
+
tt = active_task_l[i][0]
|
92
|
+
self.done_task_m[tt.name] = tt
|
93
|
+
active_task_l.pop(i)
|
94
|
+
break
|
95
|
+
if t not in self.done_task_m.keys():
|
96
|
+
task = task_m[t]
|
97
|
+
coro = asyncio.Task(task.do_run())
|
98
|
+
active_task_l.append((task, coro))
|
99
|
+
|
100
|
+
# Now, wait for tasks to complete
|
101
|
+
if len(active_task_l):
|
102
|
+
coros = list(at[1] for at in active_task_l)
|
103
|
+
res = await asyncio.gather(*coros)
|
104
|
+
|
105
|
+
# print("order: %s" % str(order))
|
106
|
+
#
|
107
|
+
# run_o = list(t.do_run() for t in task)
|
108
|
+
|
109
|
+
# ret = await asyncio.gather(*run_o)
|
110
|
+
ret = None
|
69
111
|
|
70
112
|
if unwrap:
|
71
|
-
return
|
113
|
+
return task.output
|
72
114
|
else:
|
73
|
-
return
|
115
|
+
return list(t.output for t in task)
|
116
|
+
|
117
|
+
def _mkDeps(self, dep_m, task_m, task):
|
118
|
+
if task.name not in dep_m.keys():
|
119
|
+
task_m[task.name] = task
|
120
|
+
dep_m[task.name] = set(t.name for t in task.depends)
|
121
|
+
for d in task.depends:
|
122
|
+
self._mkDeps(dep_m, task_m, d)
|
74
123
|
|
75
124
|
async def runTask(self, task : Task) -> 'TaskData':
|
76
125
|
return await task.do_run()
|
@@ -82,6 +131,7 @@ class TaskGraphRunnerLocal(TaskGraphRunner):
|
|
82
131
|
@dc.dataclass
|
83
132
|
class LocalRunnerWorker(object):
|
84
133
|
runner : TaskGraphRunnerLocal
|
85
|
-
|
134
|
+
task_s : List = dc.field(default_factory=list)
|
135
|
+
|
86
136
|
|
87
137
|
|
{dv_flow_mgr-0.0.1.12919555073a1.dist-info → dv_flow_mgr-0.0.1.12931082290a1.dist-info}/RECORD
RENAMED
@@ -4,16 +4,16 @@ dv_flow/mgr/fileset.py,sha256=FNvC5sU2ArxJ0OO3v8dXTv8zX-bZ5t0a0ljne0fQQ1o,1150
|
|
4
4
|
dv_flow/mgr/flow.py,sha256=UdgJOIqBS2wTRpO-sNWCCqO9oQFxDfGPGVD0r42aTrA,1562
|
5
5
|
dv_flow/mgr/fragment_def.py,sha256=p5i6ONtBWlDHTBFsduu3Z36_76Bn8PCIylp_xoZ7jfQ,1552
|
6
6
|
dv_flow/mgr/package.py,sha256=k6gaDun9mJeGwGsFP5YOYOaFLmKb3KyPZy5wGRgJd_E,1965
|
7
|
-
dv_flow/mgr/package_def.py,sha256=
|
7
|
+
dv_flow/mgr/package_def.py,sha256=fdPzhoCqZ-w336ktDVWZ1HKKFk9Zi6iehCcS-iW_EvU,11454
|
8
8
|
dv_flow/mgr/package_import_spec.py,sha256=bStPa727wAKMcixydVY1Ht6ylzXsSMy2K31HWPXhc9k,921
|
9
9
|
dv_flow/mgr/parameters.py,sha256=kUjRss5VtMMz5eL3-Z_M6BS-wFs7MhQu3ANXO54UPo0,896
|
10
10
|
dv_flow/mgr/pkg_rgy.py,sha256=y7HOBZAgKHL4ItnFvjT0lWC_ne81qJi4lJGNLt69au0,2581
|
11
|
-
dv_flow/mgr/task.py,sha256=
|
11
|
+
dv_flow/mgr/task.py,sha256=4ktSrDJOR7N477u8HWOBfeer1Wwc4mwqMYode1vkApY,5144
|
12
12
|
dv_flow/mgr/task_data.py,sha256=-6Dqa3oUI7RJc1Js2SRSnhxNTcASkamXFYMN6UiknZQ,10376
|
13
13
|
dv_flow/mgr/task_def.py,sha256=96hSwqJo0MazJ1VcLhovYRmNCplsNLt47AumtyjSddU,1690
|
14
|
-
dv_flow/mgr/task_graph_builder.py,sha256=
|
14
|
+
dv_flow/mgr/task_graph_builder.py,sha256=1b636njhFJ7gu-re2zBzb1g4GMKQkQmmCqk51niYnU0,7097
|
15
15
|
dv_flow/mgr/task_graph_runner.py,sha256=x2e-wpJFhZ4Zkov30PtC8CuKyOK6htA1SKzmrcVBI9M,2154
|
16
|
-
dv_flow/mgr/task_graph_runner_local.py,sha256=
|
16
|
+
dv_flow/mgr/task_graph_runner_local.py,sha256=QDCUyFj_m4hJTUsZD5nCUCnPu3hysdk65-gVA8eJ894,4546
|
17
17
|
dv_flow/mgr/task_memento.py,sha256=C7VTQpBhDEoYuDmE6YTM-6TLMLnqHp6Y0Vat1aTgtCs,1096
|
18
18
|
dv_flow/mgr/util.py,sha256=WKwMF4vwYdte5wzieSTDpZTmZU0sjQro3Ofi9moCayE,613
|
19
19
|
dv_flow/mgr/cmds/cmd_run.py,sha256=PqAbPMwqovaaq14tnNrCvP7-De8lMI09X0R7d6RIbwY,2691
|
@@ -23,9 +23,9 @@ dv_flow/mgr/std/flow.dv,sha256=pSpzrPPEu_L8DHccGfArxsKYgUfyQidShZc0ShgGtsY,500
|
|
23
23
|
dv_flow/mgr/std/message.py,sha256=BPTHnEMD4tBufQ9LvsS9Sa_0xjaJATbBpwqosWslvVA,193
|
24
24
|
dv_flow/mgr/std/task_fileset.py,sha256=UzTYONvK0X9rgy3rP9LiX4giBU8SyCCJav0LSNUJ1Qg,3140
|
25
25
|
dv_flow/mgr/std/task_null.py,sha256=UEJ3fIoIMYWVsagiQC7GHD23UES7WoH4wtq94b4tcs4,265
|
26
|
-
dv_flow_mgr-0.0.1.
|
27
|
-
dv_flow_mgr-0.0.1.
|
28
|
-
dv_flow_mgr-0.0.1.
|
29
|
-
dv_flow_mgr-0.0.1.
|
30
|
-
dv_flow_mgr-0.0.1.
|
31
|
-
dv_flow_mgr-0.0.1.
|
26
|
+
dv_flow_mgr-0.0.1.12931082290a1.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
27
|
+
dv_flow_mgr-0.0.1.12931082290a1.dist-info/METADATA,sha256=_K8BKKre8AzPLV2GnOy2xkn21sti9eA-liuG63-qP6E,13276
|
28
|
+
dv_flow_mgr-0.0.1.12931082290a1.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
|
29
|
+
dv_flow_mgr-0.0.1.12931082290a1.dist-info/entry_points.txt,sha256=1roy8wAFM48LabOvr6jiOw0MUs-qE8X3Vf8YykPazxk,50
|
30
|
+
dv_flow_mgr-0.0.1.12931082290a1.dist-info/top_level.txt,sha256=amfVTkggzYPtWwLqNmRukfz1Buu0pGS2SrYBBLhXm04,8
|
31
|
+
dv_flow_mgr-0.0.1.12931082290a1.dist-info/RECORD,,
|
{dv_flow_mgr-0.0.1.12919555073a1.dist-info → dv_flow_mgr-0.0.1.12931082290a1.dist-info}/LICENSE
RENAMED
File without changes
|
{dv_flow_mgr-0.0.1.12919555073a1.dist-info → dv_flow_mgr-0.0.1.12931082290a1.dist-info}/WHEEL
RENAMED
File without changes
|
File without changes
|
File without changes
|