在使用PyVista進行多執行緒同時顯示多個視窗的時候,發現開啟多個執行緒顯示視窗,視窗會卡死,于是便有了這篇文章,
文章目錄
- 發現問題
- 問題分析
- python多執行緒
- 問題解決
發現問題
在可視化工具——利用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://www.uj5u.com/houduan/272494.html
標籤:python
下一篇:運算子(Java)學習總結
