可視化工具PyVista多線程顯示多窗口的實(shí)例代碼
在使用PyVista進(jìn)行多線程同時顯示多個窗口的時候,發(fā)現(xiàn)開啟多個線程顯示窗口,窗口會卡死,于是便有了這篇文章。
發(fā)現(xiàn)問題
在可視化工具——利用PyVista進(jìn)行mesh的色彩映射這篇博客中,我們實(shí)現(xiàn)了使用四種方法對mesh進(jìn)行色彩映射,為了對這四種方法映射結(jié)果有一個直觀的認(rèn)識,我第一個想法就是開啟四個線程,分別調(diào)用這四個函數(shù)。
代碼如下:
定義四個色彩映射函數(shù):
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: 比較數(shù)據(jù)的名字 :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進(jìn)行色彩映射 :param mesh: 輸入mesh :param name: 比較數(shù)據(jù)的名字 :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): """ 使用進(jìn)行plot自帶的色彩映射 :param mesh: 輸入mesh :param name: 比較數(shù)據(jù)的名字 :return: """ pts = mesh.points mesh[name] = pts[:, 1] mesh.plot(scalars=name, cmap='viridis_r') def mesh_cmp_colorcet(mesh, name): """ 使用進(jìn)行colorcet進(jìn)行色彩映射 :param mesh: 輸入mesh :param name: 比較數(shù)據(jù)的名字 :return: """ pts = mesh.points mesh[name] = pts[:, 1] mesh.plot(scalars=name, cmap=colorcet.fire)
開啟四個線程調(diào)用:
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()
結(jié)果,卡頓了
問題分析
首先說一下python的多線程問題
python多線程
線程(Thread)也叫輕量級進(jìn)程,是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位,它被包涵在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位。線程自己不擁有系統(tǒng)資源,只擁有一點(diǎn)兒在運(yùn)行中必不可少的資源,但它可與同屬一個進(jìn)程的其它線程共享進(jìn)程所擁有的全部資源。一個線程可以創(chuàng)建和撤消另一個線程,同一進(jìn)程中的多個線程之間可以并發(fā)執(zhí)行。
舉個簡單的例子來理解下:
假定有一 7 * 24 小時不停工的工廠,由于其電力有限,一次僅供一個車間使用,當(dāng)一個車間在生產(chǎn)時,其他車間停工。在這里我們可以理解這個工廠相當(dāng)于操作系統(tǒng),供電設(shè)備相當(dāng)于 CPU,一個車間相當(dāng)于一個進(jìn)程。
一個車間里,可以有很多工人。他們協(xié)同完成一個任務(wù)。車間的空間是工人們共享的,這里一個工人就相當(dāng)于一個線程,一個進(jìn)程可以包括多個線程。比如許多房間是每個工人都可以進(jìn)出的。這象征一個進(jìn)程的內(nèi)存空間是共享的,每個線程都可以使用這些共享內(nèi)存。
Python 多線程適合用在 I/O 密集型任務(wù)中。I/O 密集型任務(wù)較少時間用在 CPU 計算上,較多時間用在 I/O 上,如文件讀寫,web 請求,數(shù)據(jù)庫請求 等;而對于計算密集型任務(wù),應(yīng)該使用多進(jìn)程。
參考: https://blog.csdn.net/somezz/article/details/80963760
問題解決
很明顯,應(yīng)該使用多進(jìn)程來顯示四個窗口。
代碼:
if __name__ == '__main__': #mesh = pv.read('vtkData/airplane.ply') mesh = examples.download_embryo() # 開啟多進(jìn)程用于可視化曲面 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()
結(jié)果:
到此這篇關(guān)于可視化工具PyVista多線程顯示多窗口的實(shí)例代碼的文章就介紹到這了,更多相關(guān)PyVista可視化工具內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實(shí)現(xiàn)用于測試網(wǎng)站訪問速率的方法
這篇文章主要介紹了python實(shí)現(xiàn)用于測試網(wǎng)站訪問速率的方法,涉及Python中urllib2模塊及時間的相關(guān)操作技巧,需要的朋友可以參考下2015-05-05樹莓派(python)與arduino串口通信的詳細(xì)步驟
這篇文章主要介紹了樹莓派(python)與arduino串口通信的詳細(xì)步驟,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-11-11pycharm安裝深度學(xué)習(xí)pytorch的d2l包失敗問題解決
當(dāng)新生在學(xué)習(xí)pytorch時,導(dǎo)入d2l_pytorch包總會遇到問題,下面這篇文章主要給大家介紹了關(guān)于pycharm安裝深度學(xué)習(xí)pytorch的d2l包失敗問題的解決方法,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-03-03python調(diào)用動態(tài)鏈接庫的基本過程詳解
這篇文章主要介紹了python調(diào)用動態(tài)鏈接庫的基本過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06Python attrs提高面向?qū)ο缶幊绦试敿?xì)
Python是面向?qū)ο蟮恼Z言,一般情況下使用面向?qū)ο缶幊虝沟瞄_發(fā)效率更高,軟件質(zhì)量更好,并且代碼更易于擴(kuò)展,可讀性和可維護(hù)性也更高,但是Python的類寫起來是真的累,這是可以在創(chuàng)建類的時候自動添加上attrs模塊,下面文章我們就來介紹這個東西,需要的朋友可參考一下2021-09-09Windows系統(tǒng)下安裝Python的SSH模塊教程
這篇文章主要介紹了Windows系統(tǒng)下安裝Python的SSH模塊教程,本文涵蓋了pycrypto、ecdsa、paramiko、OpenSSH、SSH等模塊的安裝,需要的朋友可以參考下2015-02-02Python reduce函數(shù)作用及實(shí)例解析
這篇文章主要介紹了Python reduce函數(shù)作用及實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-05-05