我已经读过matplotlib通常不是线程安全的。因此,让我们假设正确的同步。我在matplotlib-users讨论中也遇到了以下声明:
所有GUI内容必须发生在主线程上(如果你做线程),但是 对于某些后端
draw_idle()
可能是线程安全的。
(感谢@tacaswell)
但是考虑了哪些方法" GUI的东西"哪个后端对draw_idle()
的线程安全?
考虑一个简单的matplotlib + wxpython phoenix示例:
#!/usr/bin/env python3
from threading import Thread
import numpy as np
import wx
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as Canvas
from matplotlib.figure import Figure
app = wx.App()
frame = wx.Frame(None)
panel = wx.Panel(frame)
figure = Figure()
canvas = Canvas(panel, wx.ID_ANY, figure)
def slow():
figure.gca().imshow(np.random.randn(5_000, 5_000))
canvas.draw_idle()
button = wx.Button(panel, label='Go')
button.Bind(wx.EVT_BUTTON, lambda event: Thread(target=slow).start())
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(canvas, 1, wx.EXPAND)
sizer.Add(button, 0, wx.ALIGN_RIGHT)
panel.SetSizer(sizer)
frame.Show()
app.MainLoop()
我从GUI线程外部调用imshow()
和draw_idle()
,它似乎工作正常。
如果我在整个实际应用程序中重复这种方法,我会遇到麻烦吗?是否有必要将这些方法调用中的任何一个移入GUI线程?如果不是,draw_idle()
在wxpython下实际上是线程安全还是需要同步?