Skip to content

Instantly share code, notes, and snippets.

@romankolpak
Created August 26, 2024 19:50
Show Gist options
  • Save romankolpak/9f7736d2a5c85a7b2c892d27ef1626ff to your computer and use it in GitHub Desktop.
Save romankolpak/9f7736d2a5c85a7b2c892d27ef1626ff to your computer and use it in GitHub Desktop.
import asyncio
from graphlib import TopologicalSorter
graph = {
"A": ["B", "C"],
"B": ["D"],
"C": ["D"],
"D": ["E"],
}
async def runner(node: str, sorter: TopologicalSorter):
print(f"processing node {node}")
sorter.done(node)
async def main():
sorter = TopologicalSorter(graph)
sorter.prepare()
while sorter.is_active():
node_group = sorter.get_ready()
if not node_group:
await asyncio.sleep(0.25)
else:
tasks = set()
for node in node_group:
task = asyncio.create_task(runner(node, sorter))
tasks.add(task)
task.add_done_callback(tasks.discard)
if __name__ == "__main__":
asyncio.run(main())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment