可视化工具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()

结果,卡顿了

可视化工具PyVista多线程显示多窗口的实例代码

问题分析

首先说一下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()

结果:

可视化工具PyVista多线程显示多窗口的实例代码

来源:https://blog.csdn.net/weixin_44456692/article/details/115425682

标签:PyVista,可视化工具,多线程
0
投稿

猜你喜欢

  • Python利用Selenium实现弹出框的处理

    2021-11-12 23:21:50
  • YUI3设计中的激进和妥协

    2010-01-17 09:59:00
  • Python变量及数据类型用法原理汇总

    2022-12-04 11:11:41
  • python Windows最新版本安装教程

    2023-02-25 21:09:52
  • Python+Selenium实现一键摸鱼&采集数据

    2021-08-22 01:05:41
  • Python可视化神器pyecharts绘制地理图表

    2023-11-28 21:26:22
  • python数据类型可变不可变知识点总结

    2021-10-29 13:26:11
  • Python实现的径向基(RBF)神经网络示例

    2022-03-06 23:44:35
  • Python编写车票订购系统 Python实现快递收费系统

    2023-06-26 15:37:26
  • python条件语句和while循环语句

    2023-08-31 06:17:56
  • python实现自动更换ip的方法

    2023-06-16 21:43:06
  • python生成器的使用方法

    2021-12-03 22:40:49
  • Python操作数据库之数据库编程接口

    2024-01-25 01:55:41
  • Python3标准库glob文件名模式匹配的问题

    2021-08-29 14:00:23
  • 一文教你学会定位线上MySQL锁超时问题

    2024-01-22 13:19:45
  • Vue使用Less与Scss实现主题切换方法详细讲解

    2024-04-27 15:48:13
  • MySQL性能压力基准测试工具sysbench的使用简介

    2024-01-25 04:58:35
  • python字典的遍历3种方法详解

    2022-05-01 06:00:44
  • Python实现的建造者模式示例

    2023-06-02 07:17:00
  • TypeScript中命名空间与模块化详情

    2024-04-25 13:11:23
  • asp之家 网络编程 m.aspxhome.com