可视化工具PyVista多线程显示多窗口的实例代码
作者:薛定猫 发布时间:2023-03-17 07:46:28
在使用PyVista进行多线程同时显示多个窗口的时候,发现开启多个线程显示窗口,窗口会卡死,于是便有了这篇文章。
发现问题
在可视化工具——利用PyVista进行mesh的色彩映射这篇博客中,我们实现了使用四种方法对mesh进行色彩映射,为了对这四种方法映射结果有一个直观的认识,我第一个想法就是开启四个线程,分别调用这四个函数。
代码如下:
定义四个色彩映射函数:
import pyvista as pv
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
import numpy as np
import colorcet
import threading
from pyvista.demos import demos
from pyvista import examples
import multiprocessing
def mesh_cmp_custom(mesh, name):
"""
自定义色彩映射
:param mesh: 输入mesh
:param name: 比较数据的名字
:return:
"""
pts = mesh.points
mesh[name] = pts[:, 1]
# Define the colors we want to use
blue = np.array([12 / 256, 238 / 256, 246 / 256, 1])
black = np.array([11 / 256, 11 / 256, 11 / 256, 1])
grey = np.array([189 / 256, 189 / 256, 189 / 256, 1])
yellow = np.array([255 / 256, 247 / 256, 0 / 256, 1])
red = np.array([1, 0, 0, 1])
c_min = mesh[name].min()
c_max = mesh[name].max()
c_scale = c_max - c_min
mapping = np.linspace(c_min, c_max, 256)
newcolors = np.empty((256, 4))
newcolors[mapping >= (c_scale * 0.8 + c_min)] = red
newcolors[mapping < (c_scale * 0.8 + c_min)] = grey
newcolors[mapping < (c_scale * 0.55 + c_min)] = yellow
newcolors[mapping < (c_scale * 0.3 + c_min)] = blue
newcolors[mapping < (c_scale * 0.1 + c_min)] = black
# Make the colormap from the listed colors
my_colormap = ListedColormap(newcolors)
mesh.plot(scalars=name, cmap=my_colormap)
def mesh_cmp_mpl(mesh, name):
"""
使用Matplotlib进行色彩映射
:param mesh: 输入mesh
:param name: 比较数据的名字
:return:
"""
pts = mesh.points
mesh[name] = pts[:, 1]
mlp_cmap = plt.cm.get_cmap("viridis", 25)
mesh.plot(scalars=name, cmap=mlp_cmap)
def mesh_cmp(mesh, name):
"""
使用进行plot自带的色彩映射
:param mesh: 输入mesh
:param name: 比较数据的名字
:return:
"""
pts = mesh.points
mesh[name] = pts[:, 1]
mesh.plot(scalars=name, cmap='viridis_r')
def mesh_cmp_colorcet(mesh, name):
"""
使用进行colorcet进行色彩映射
:param mesh: 输入mesh
:param name: 比较数据的名字
:return:
"""
pts = mesh.points
mesh[name] = pts[:, 1]
mesh.plot(scalars=name, cmap=colorcet.fire)
开启四个线程调用:
if __name__ == '__main__':
#mesh = pv.read('vtkData/airplane.ply')
mesh = examples.download_embryo()
# 开启多线程用于可视化曲面
t1 = threading.Thread(target=mesh_cmp, args=(mesh, 'y_height',))
t1.start()
t2 = threading.Thread(target=mesh_cmp_mpl, args=(mesh, 'y_height',))
t2.start()
t3 = threading.Thread(target=mesh_cmp_custom, args=(mesh, 'y_height',))
t3.start()
t1.join()
t2.join()
t3.join()
结果,卡顿了
问题分析
首先说一下python的多线程问题
python多线程
线程(Thread)也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。
举个简单的例子来理解下:
假定有一 7 * 24 小时不停工的工厂,由于其电力有限,一次仅供一个车间使用,当一个车间在生产时,其他车间停工。在这里我们可以理解这个工厂相当于操作系统,供电设备相当于 CPU,一个车间相当于一个进程。
一个车间里,可以有很多工人。他们协同完成一个任务。车间的空间是工人们共享的,这里一个工人就相当于一个线程,一个进程可以包括多个线程。比如许多房间是每个工人都可以进出的。这象征一个进程的内存空间是共享的,每个线程都可以使用这些共享内存。
Python 多线程适合用在 I/O 密集型任务中。I/O 密集型任务较少时间用在 CPU 计算上,较多时间用在 I/O 上,如文件读写,web 请求,数据库请求 等;而对于计算密集型任务,应该使用多进程。
参考: https://blog.csdn.net/somezz/article/details/80963760
问题解决
很明显,应该使用多进程来显示四个窗口。
代码:
if __name__ == '__main__':
#mesh = pv.read('vtkData/airplane.ply')
mesh = examples.download_embryo()
# 开启多进程用于可视化曲面
p1 = multiprocessing.Process(target=mesh_cmp_custom, args=(mesh, 'y_height',))
p2 = multiprocessing.Process(target=mesh_cmp_mpl, args=(mesh, 'y_height',))
p3 = multiprocessing.Process(target=mesh_cmp, args=(mesh, 'y_height',))
p1.start()
p2.start()
p3.start()
p1.join()
p2.join()
p3.join()
结果:
来源:https://blog.csdn.net/weixin_44456692/article/details/115425682
猜你喜欢
- 图像有时候比数据更能满足人们的视觉需求Pytorch中保存图片的方式pytorch下保存图像有很多种方法,但是这些基本上都是基于图像处理的,
- 本文实例为大家分享了python定时复制远程文件夹中文件的具体代码,供大家参考,具体内容如下import os, shutil, sysim
- 在编写程序时,数据库结构会经常变化,所以经常需要编写一些数据库脚本,编写完成后需发往现场执行,如果已经存在或者重复执行,有些脚本会报错,所以
- 1.cut()可以实现类似于对成绩进行优良统计的功能,来看代码示例。假如我们有一组学生成绩,我们需要将这些成绩分为不及格(0-59)、及格(
- Insus.NET解决这个问题,只有创建另外一个表,将存储用户决定要跟踪的表,以及这个表中需要跟踪的字段。 还要创建另外一个表[Audit]
- 本文实例为大家分享了python实现简单聊天室的具体代码,供大家参考,具体内容如下刚刚接触python编程,又从接触java开始一直对soc
- 在python中,一个文件(以“.py”为后缀名的文件)就叫做一个模块,每一个模块在python里都
- 手动安装Anaconda环境变量安装 Anaconda后,在命令行执行python命令或conda命令会报错无法找到此时就需要我们手动添加环
- 一般来说,我们判断 iframe 是否加载完成其实与 判断 JavaScript 文件是否加载完成 采用的方法很类似:var&nb
- 脚本运行环境python 3.6+edge浏览器(推荐使用,因为在edge浏览器中可以获得额外12分,当然chrome浏览器也可以)webd
- 一.基本数据类型整数:int字符串:str(注:\t等于一个tab键)布尔值: bool列表:list (元素的集合)列表用[]元祖:tup
- 本文实例讲述了Python基于回溯法解决01背包问题。分享给大家供大家参考,具体如下:同样的01背包问题,前面采用动态规划的方法,现在用回溯
- 1. __init__ 初始化文件路径,关键字1,关键字2;2. key_match 使用with open 方法,以二进制方式(也可以改成
- 在工控应用上,返回的数据经常会以二进制的形成存储,而这些二进制数据又是以每4个bit表示一个十六进制的数据内容。解析的时候,往往是一个字节(
- 在pytest自动化测试中,如果只是简单的从应用的角度来说,完全可以不去了解pytest中的显示信息的部分以及原理,完全可以通过使用推荐的p
- 随机漫步生成是无规则的,是系统自行选择的结果。根据设定的规则自定生成,上下左右的方位,每次所经过的方向路径。首先,创建一个RandomWal
- 本文实例讲述了Python实现的根据文件名查找数据文件功能。分享给大家供大家参考,具体如下:#-*- coding: UTF-8 -*-im
- 这篇文章主要介绍了python有序查找算法 二分法实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要
- 使用 designer 进行开发首先要知道,使用 Qt designer 和 代码进行 Qt 开发实现页面跳转是不一样的,这里我们使用的是
- 在中文分词中,jiebe库是最为常见的,主要的原因还是它独特的支持分词模式如:精确模式、全模式、搜索引擎模式。也对应着三种方式,包括jieb