asyncionetworkxFuncAnimation学习--动态显示计算图的运行情况

本文主要是介绍asyncionetworkxFuncAnimation学习--动态显示计算图的运行情况,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

asyncio&networkx&FuncAnimation学习--动态显示计算图的运行情况

  • 一.效果
  • 二.代码

一.目的
1.动态显示计算图的运行状态(点或边是否已完成)
二.步骤:
1.定义计算图
2.asyncio 并行计算
3.networkx 显示计算图
4.FuncAnimation 动态更新
三.依赖:
conda install pygraphviz

一.效果

请添加图片描述

二.代码

# -*- coding: utf-8 -*-'''
一.目的
1.动态显示计算图的运行状态(点或边是否已完成)
二.步骤:
1.定义计算图
2.asyncio 并行计算
3.networkx 显示计算图
4.FuncAnimation 动态更新
三.依赖:
conda install pygraphviz
'''import networkx as nx
import matplotlib.pyplot as plt
import asyncio
from matplotlib.animation import FuncAnimation
import asyncio
import datetime
import numpy as np
import threading
from io import BytesIO
from PIL import Imageclass Node:'''节点信息'''event_man = {}node_refs = {}    def __init__(self, name, inputs,callback) -> None:self.name = nameself.event_man = Node.event_manself.callback = callbackself.node_refs = Node.node_refsself.event_man[self.name] = Noneself.node_refs[self.name] = inputsself.delay = np.random.randint(1, 5)async def run(self):# 等待上游节点for ev in self.node_refs[self.name]:await self.event_man[ev].wait()self.callback((ev, self.name), "edge")# 模拟耗时await asyncio.sleep(self.delay)# 触发下游节点self.callback(f"{self.name}", "node")self.event_man[self.name].set()if __name__ == "__main__":G = nx.DiGraph()node_colors = {}edge_colors = {}semaphore = threading.Semaphore(0)def event_callback(name, event):print(datetime.datetime.now().strftime("%H:%M:%S.%f"), name)# 修改节点或边的颜色if event == "node":node_colors[name] = "red"elif event == "edge":edge_colors[name] = "red"semaphore.release()graph_nodes = []graph_nodes.append(Node("A", [], event_callback))graph_nodes.append(Node("B", ["A"], event_callback))graph_nodes.append(Node("B1", ["B"], event_callback))graph_nodes.append(Node("B2", ["B1"], event_callback))graph_nodes.append(Node("B3", ["B2"], event_callback))graph_nodes.append(Node("B4", ["B2"], event_callback))graph_nodes.append(Node("C", ["A"], event_callback))graph_nodes.append(Node("D", ["B4", "B3", "C"], event_callback))# 添加节点for x in graph_nodes:G.add_node(x.name, name=x.name, color="green")# 添加边for k, v in Node.node_refs.items():for j in v:G.add_edge(j, k, name=f"{j}->{k}", color="green")# 设置layoutfor layer, nodes in enumerate(nx.topological_generations(G)):for node in nodes:G.nodes[node]["layer"] = layer#pos = nx.multipartite_layout(G, subset_key="layer")pos = nx.nx_agraph.pygraphviz_layout(G, prog='dot') #垂直布局node_labels = nx.get_node_attributes(G, 'name')edge_labels = nx.get_edge_attributes(G, 'name')node_colors = nx.get_node_attributes(G, 'color')edge_colors = nx.get_edge_attributes(G, 'color')async def graph_forward(nodes):global node_colorsglobal edge_colorsnode_colors = nx.get_node_attributes(G, 'color')edge_colors = nx.get_edge_attributes(G, 'color')for k in Node.event_man.keys():Node.event_man[k] = asyncio.Event()        await asyncio.gather(*[asyncio.create_task(x.run()) for x in nodes])fig = plt.figure(figsize=(6,12))snapshots = []def fig_update(data):semaphore.acquire() #有事件触发才更新nx.draw_networkx_labels(G, pos, labels=node_labels)nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)nx.draw_networkx(G, pos,nodelist=node_colors.keys(),node_color=node_colors.values(),edgelist=edge_colors.keys(),edge_color=edge_colors.values())# 截图buf = BytesIO()plt.savefig(buf, format='png')buf.seek(0)pil_image = Image.open(buf)snapshots.append(pil_image)ani = FuncAnimation(fig, fig_update, interval=100)def trigger(snapshots):while True:asyncio.run(graph_forward(graph_nodes))# 保存gifsnapshots[1].save("out.gif",save_all=True,append_images=snapshots[2:],duration=500,loop=0)print("Finished")breakt=threading.Thread(target=trigger, args=(snapshots,))t.setDaemon(True)t.start()plt.show()

这篇关于asyncionetworkxFuncAnimation学习--动态显示计算图的运行情况的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/954755

相关文章

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

windows和Linux使用命令行计算文件的MD5值

《windows和Linux使用命令行计算文件的MD5值》在Windows和Linux系统中,您可以使用命令行(终端或命令提示符)来计算文件的MD5值,文章介绍了在Windows和Linux/macO... 目录在Windows上:在linux或MACOS上:总结在Windows上:可以使用certuti

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Python如何精准判断某个进程是否在运行

《Python如何精准判断某个进程是否在运行》这篇文章主要为大家详细介绍了Python如何精准判断某个进程是否在运行,本文为大家整理了3种方法并进行了对比,有需要的小伙伴可以跟随小编一起学习一下... 目录一、为什么需要判断进程是否存在二、方法1:用psutil库(推荐)三、方法2:用os.system调用

Python运行中频繁出现Restart提示的解决办法

《Python运行中频繁出现Restart提示的解决办法》在编程的世界里,遇到各种奇怪的问题是家常便饭,但是,当你的Python程序在运行过程中频繁出现“Restart”提示时,这可能不仅仅是令人头疼... 目录问题描述代码示例无限循环递归调用内存泄漏解决方案1. 检查代码逻辑无限循环递归调用内存泄漏2.

浅析CSS 中z - index属性的作用及在什么情况下会失效

《浅析CSS中z-index属性的作用及在什么情况下会失效》z-index属性用于控制元素的堆叠顺序,值越大,元素越显示在上层,它需要元素具有定位属性(如relative、absolute、fi... 目录1. z-index 属性的作用2. z-index 失效的情况2.1 元素没有定位属性2.2 元素处

Java终止正在运行的线程的三种方法

《Java终止正在运行的线程的三种方法》停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作,停止一个线程可以用Thread.stop()方法,但最好不要用它,本文给大家介绍了... 目录前言1. 停止不了的线程2. 判断线程是否停止状态3. 能停止的线程–异常法4. 在沉睡中停止5

查看Oracle数据库中UNDO表空间的使用情况(最新推荐)

《查看Oracle数据库中UNDO表空间的使用情况(最新推荐)》Oracle数据库中查看UNDO表空间使用情况的4种方法:DBA_TABLESPACES和DBA_DATA_FILES提供基本信息,V$... 目录1. 通过 DBjavascriptA_TABLESPACES 和 DBA_DATA_FILES

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

在VSCode中本地运行DeepSeek的流程步骤

《在VSCode中本地运行DeepSeek的流程步骤》本文详细介绍了如何在本地VSCode中安装和配置Ollama和CodeGPT,以使用DeepSeek进行AI编码辅助,无需依赖云服务,需要的朋友可... 目录步骤 1:在 VSCode 中安装 Ollama 和 CodeGPT安装Ollama下载Olla