[~] Refactor
This commit is contained in:
parent
bd883d810c
commit
e27e5af370
@ -381,3 +381,79 @@ def audio_get() -> audio_get_t.res_t:
|
|||||||
path_mp3=path_mp3,
|
path_mp3=path_mp3,
|
||||||
url=url,
|
url=url,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@shared_task()
|
||||||
|
def process_graph(
|
||||||
|
nodes: dict[str, Any],
|
||||||
|
data_deps: dict(str, Iterable[str]),
|
||||||
|
execution_deps: dict(str, Iterable[str]),
|
||||||
|
) -> Any:
|
||||||
|
import networkx
|
||||||
|
|
||||||
|
g_data = networkx.DiGraph()
|
||||||
|
g_execution = networkx.DiGraph()
|
||||||
|
|
||||||
|
for v in nodes:
|
||||||
|
g_data.add_node(v)
|
||||||
|
g_execution.add_node(v)
|
||||||
|
|
||||||
|
for b, deps in data_deps.items():
|
||||||
|
for a in deps:
|
||||||
|
g_data.add_edge(a, b)
|
||||||
|
g_execution.add_edge(a, b)
|
||||||
|
|
||||||
|
for b, deps in execution_deps.items():
|
||||||
|
for a in deps:
|
||||||
|
g_execution.add_edge(a, b)
|
||||||
|
|
||||||
|
task_ids = dict()
|
||||||
|
done_ids = set()
|
||||||
|
error_ids = set()
|
||||||
|
pending_ids = set()
|
||||||
|
active_queue = collections.deque()
|
||||||
|
|
||||||
|
ordered_nodes = networkx.topological_sort(g_execution)
|
||||||
|
node_id = 0
|
||||||
|
while node_id < len(ordered_tasks):
|
||||||
|
node = ordered_tasks[node_id]
|
||||||
|
|
||||||
|
if any([
|
||||||
|
v in task_ids and task_ids[v] in pending_ids
|
||||||
|
for v in g_execution.predecessors(node)
|
||||||
|
]):
|
||||||
|
task_id = active_queue.popleft()
|
||||||
|
try:
|
||||||
|
result = task.backend.wait_for(task_id, interval=0.1,)
|
||||||
|
if result.state == celery.states.SUCCESS:
|
||||||
|
done_ids.add(result.id)
|
||||||
|
continue
|
||||||
|
except:
|
||||||
|
error_ids.add(task.id)
|
||||||
|
logger.error(json.dumps(dict(
|
||||||
|
msg=traceback.format_exc(),
|
||||||
|
)))
|
||||||
|
break
|
||||||
|
finally:
|
||||||
|
del pending_ids(task.id)
|
||||||
|
else:
|
||||||
|
args = [
|
||||||
|
celery.result.AsyncResult(
|
||||||
|
task_ids[v]
|
||||||
|
).result
|
||||||
|
for v in g_data.predecessors(node)
|
||||||
|
]
|
||||||
|
task = nodes[node].apply_async(*args)
|
||||||
|
task_ids[node] = task.id
|
||||||
|
pending_ids.add(task.id)
|
||||||
|
active
|
||||||
|
del args
|
||||||
|
del task
|
||||||
|
node_id += 1
|
||||||
|
|
||||||
|
return dict(
|
||||||
|
ordered_nodes=ordered_nodes,
|
||||||
|
done_ids=done_ids,
|
||||||
|
task_ids=task_ids,
|
||||||
|
error_ids=error_ids,
|
||||||
|
pending_ids=pending_ids,
|
||||||
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user