可视化工具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可视化工具内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • JavaScript实现鼠标控制自由移动的窗口

    本文实例为大家分享了JavaScript实现鼠标控制自由窗口的具体代码,供大家参考,具体内容如下 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>用鼠标移动的窗口</title> <style> .mainDiv { width: 350px; height: 200px; borde

  • Pyqt5 实现窗口缩放,控件在窗口内自动伸缩的操作

    在Qtdesigner中新建一个主界面如下所示: ctrl+R 预览 从预览图中可以看出这时的界面不支持伸缩,拖动过小的话会导致部分界面遮住不可见,这时我们就要用到布局选项,首先对上面的按钮和文本框布局按住ctrl选中要布局的控件 根据实际情况选中工具栏上的布局按钮,我这里是网格布局 选中后如下所示 然后在对底下的listwidget和tablewidget进行水平布局,布局完成后如下所示,其中有个细节是还要对Qgroupbox在进行一次水平或垂直布局,具体是选中Qgroupbox控件然后点击水

  • C#仿QQ聊天窗口

    本文实例为大家分享了C#实现QQ聊天窗口的具体代码,供大家参考,具体内容如下 效果图: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows

  • Java 滑动窗口最大值的实现

    一.题目 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口内的 k 个数字.滑动窗口每次只向右移动一位. 返回滑动窗口中的最大值. 二.单调队列解析 题目让求随着滑动窗口的滑动,返回窗口覆盖范围的最大值 该题不适合优先级队列,因为采用大顶堆存放k个数字,可以知道此时的最大值,但是窗口是滑动的,大顶堆每次只能弹出最大值,无法移除其他值,即无法用大顶堆维护滑动窗口里的值. 所以采用队列维护,随着窗口的移动,队列先进先出 此时对队列的要求

  • Python爬虫之Selenium多窗口切换的实现

    前言:在页面操作过程中有时候点击某个链接会弹出新的窗口,但由于Selenium的所有操作都是在第一个打开的页面进行的,这时就需要主机切换到新打开的窗口上进行操作.WebDriver提供了switch_to.window()方法,可以实现在不同的窗口之间切换. 以百度首页和百度注册页为例,在两个窗口之间的切换. 本章中用到的关键方法如下: current_window_handle:获得当前窗口句柄 window_handles:返回所有窗口的句柄到当前会话 switch_to.window():

  • Java窗口精细全方位讲解

    目录 一.新建简单窗口 二.编写窗口中的按键 三.简单的按键运行 1.流布局管理器: 2.静态文本框: 四.窗口画图 五.窗口鼠标响应 六.总结 好了,stop! 我们呢 咳咳咳 下面呢 也就直接进入正题!!! 一.新建简单窗口 在java中新建窗口将会用到"java.awt",大家可以参见API文档 import java.awt.*; //包含用于创建用户界面和绘制图形图像的所有类. 这是API文档的下载链接: API下载地址 我呢用的是Notpad++进行编写的,所以就用这个直接

  • C语言实现四窗口聊天

    C语言实现四窗口聊天,供大家参考,具体内容如下 为了练习前段时间学习的共享内存.管道.消息队列等进程同步机制,做了一个聊天小项目. 项目描述: 有4个进程,A进程和B进程负责通信,从标准输入读到的字符串通过管道发给对方,A1和B1进程负责显示,其中: A进程和B进程通过管道通信,A进程和A1进程通过共享内存通信,B进程和B1进程通过消息队列通信: A进程从标准输入读到的字符串后,放到管道和共享内存里,从管道中读到的字符串放到共享内存里,B进程从管道中拿到A放的字符串,A1进程到共享内存中拿到字符

  • Android窗口小部件基础编写代码实例

    实现窗口小部件,访问手机储存卡指定目录中的图片文件,然后随机选择一张在窗口的小部件中显示.图片路径使用List存储,适合初级Android学习者参考.本系统无服务,不能保证进程长存. 新建一个空的布局项目,然后新建一个Widget,如图所示: 在新建的xml和java实现类中进行编写即可. picture_widget.xml文件如下: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android&quo

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

    在使用PyVista进行多线程同时显示多个窗口的时候,发现开启多个线程显示窗口,窗口会卡死,于是便有了这篇文章. 发现问题 在可视化工具--利用PyVista进行mesh的色彩映射这篇博客中,我们实现了使用四种方法对mesh进行色彩映射,为了对这四种方法映射结果有一个直观的认识,我第一个想法就是开启四个线程,分别调用这四个函数. 代码如下: 定义四个色彩映射函数: import pyvista as pv import matplotlib.pyplot as plt from matplotl

  • jQuery EasyUI window窗口使用实例代码

    需求:点击[增加]按钮,弹出窗口,并对所有输入项内容进行校验,校验通过就提交给后台的action处理,没有通过校验就弹窗提示. <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>管理取派员</title> <!-- 导入jquery核心类库 --> <script type="text/javascript"

  • Javascript highcharts 饼图显示数量和百分比实例代码

    Javascript highcharts 饼图显示数量和百分比实例代码 最近公司项目需求有这样一个功能模块,highcharts 饼图显示数量和百分比 ,由于本人刚入门,看到这个需求不会写,于是就上网搜下相关资料,觉得一篇还不错记录下. <div class="piecleft" id="chart" style="height:350px; width: 350px;"> </div> <script type=

  • Android 模拟新闻APP显示界面滑动优化实例代码

    内容: 1.滑动优化(滑动时不加载图片,停止才加载) 2.第一次进入时手动加载 代码如下: 1.界面布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:

  • Bootstrap中点击按钮后变灰并显示加载中实例代码

    Bootstrap插件非常的好用了,我们今天一起来看一篇关于Bootstrap实现点击按钮之后按钮变成不可点击的一个效果了,具体的如下所示. 1.在按钮中加入data-loading-text,即点击按钮后显示的文字 <button type="submit" class="btn btn-primary btn-check" data-loading-text="提交中...">添加成员</button> 2.当点击按钮

  • Vue.js 点击按钮显示/隐藏内容的实例代码

    实例代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>vue点击切换显示隐藏</title> <script src="https://cdn.bootcss.com/vue/2.2.2/vue.min.js"></script> </head> <body> <d

  • python Matplotlib底图中鼠标滑过显示隐藏内容的实例代码

    在使用Matplotlib画图过程中,有些内容必须鼠标点击或者划过才可以显示,这个问题可以依赖于annotate(s='str' ,xy=(x,y) ,xytext=(l1,l2) ,..)这个函数,其中s 为注释文本内容 , xy 为被注释的坐标点, xytext 为注释文字的坐标位置,其他参数可自行百度哈.当鼠标滑过时候,将其设置为可见,默认情况下为隐藏.下面是一个小例子: # -*- coding: UTF-8 -*- import matplotlib.pyplot as plt fig

  • Angular 实现输入框中显示文章标签的实例代码

    很多网站发帖的时候标签输入框看起来像是在 <input> 元素中直接显示标签. 比如这种 一开始以为是把 <span> 放在 <input> 中, 看了下 Stack Overflow 和 SegmentFault 的实现方式, 原来是用一个 <div> 把 <span> 和 <input> 包起来, 然后让 <div> 模仿出输入框的样式. 再给 <div> 加上eventListensor, 点击 <

  • java中对list分页并显示数据到页面实例代码

    有时候需要根据条件查询得出的数据较多,需要分页显示到页面上.这时点击下一页就不方便每次带查询条件在数据库中分页.可以在list中进行分页. page的model类: public class Page { private Integer currentPage;//当前页 private int pageSize;//每页显示记录条数 private int totalPage;//总页数 private List<?> dataList;//每页显示的数据 private int star;

  • IOS在SwiftUI中显示模态视图的实例代码

    简介 这里教大家如何弹出一个简单的模态视图.分别有两个页面,ContentView和GCPresentedView,以下对应简称为A和B.我们要做的是在A视图中点击按钮跳转到B视图,然后再从B视图点击按钮返回到A视图. 步骤 在A视图中创建按钮和模态视图代码 struct ContentView: View { @State var isPresented = false var body: some View { Button(action: { self.isPresented = true

随机推荐