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

 更新时间:2021年04月06日 09:30:23   作者:薛定猫  
这篇文章主要介绍了可视化工具PyVista多线程显示多窗口,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

在使用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()

结果:

在这里插入图片描述

到此这篇关于可视化工具PyVista多线程显示多窗口的实例代码的文章就介绍到这了,更多相关PyVista可视化工具内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python验证码识别教程之利用滴水算法分割图片

    python验证码识别教程之利用滴水算法分割图片

    这篇文章主要给大家介绍了关于python验证码识别教程之利用滴水算法分割图片的相关资料,文章中通过示例代码介绍的非常详细,对大家的学习或者具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-06-06
  • python实现用于测试网站访问速率的方法

    python实现用于测试网站访问速率的方法

    这篇文章主要介绍了python实现用于测试网站访问速率的方法,涉及Python中urllib2模块及时间的相关操作技巧,需要的朋友可以参考下
    2015-05-05
  • 树莓派(python)与arduino串口通信的详细步骤

    树莓派(python)与arduino串口通信的详细步骤

    这篇文章主要介绍了树莓派(python)与arduino串口通信的详细步骤,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-11-11
  • python注释和运算符详解

    python注释和运算符详解

    这篇文章主要为大家介绍了python注释和运算符,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • pycharm安装深度学习pytorch的d2l包失败问题解决

    pycharm安装深度学习pytorch的d2l包失败问题解决

    当新生在学习pytorch时,导入d2l_pytorch包总会遇到问题,下面这篇文章主要给大家介绍了关于pycharm安装深度学习pytorch的d2l包失败问题的解决方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • python调用动态链接库的基本过程详解

    python调用动态链接库的基本过程详解

    这篇文章主要介绍了python调用动态链接库的基本过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • Python attrs提高面向对象编程效率详细

    Python attrs提高面向对象编程效率详细

    Python是面向对象的语言,一般情况下使用面向对象编程会使得开发效率更高,软件质量更好,并且代码更易于扩展,可读性和可维护性也更高,但是Python的类写起来是真的累,这是可以在创建类的时候自动添加上attrs模块,下面文章我们就来介绍这个东西,需要的朋友可参考一下
    2021-09-09
  • python使用信号量动态更新配置文件的操作

    python使用信号量动态更新配置文件的操作

    这篇文章主要介绍了python使用信号量动态更新配置文件的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • Windows系统下安装Python的SSH模块教程

    Windows系统下安装Python的SSH模块教程

    这篇文章主要介绍了Windows系统下安装Python的SSH模块教程,本文涵盖了pycrypto、ecdsa、paramiko、OpenSSH、SSH等模块的安装,需要的朋友可以参考下
    2015-02-02
  • Python reduce函数作用及实例解析

    Python reduce函数作用及实例解析

    这篇文章主要介绍了Python reduce函数作用及实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05

最新评论