【问题标题】:Python: Plot some data (matplotlib) without GILPython:在没有 GIL 的情况下绘制一些数据(matplotlib)
【发布时间】:2011-02-14 05:31:51
【问题描述】:

我的问题当然是 GIL。在我分析数据时,最好在两者之间展示一些图(这样等待结果不会太无聊)

但是 GIL 阻止了这一点(这让我开始问自己 Python 是否是一个好主意)。

我只能显示绘图,等到用户关闭它然后开始计算。显然是在浪费时间。

我已经尝试过 subprocess 和 multiprocessing 模块,但似乎无法让它们工作。

对这个有什么想法吗? 谢谢

编辑:好的,所以它不是 GIL,而是 show()。

【问题讨论】:

    标签: python matplotlib parallel-processing gil


    【解决方案1】:

    这不是 matplotlib 或 GIL 的问题。

    在 matplotlib 中,您可以打开任意数量的图形并将它们显示在屏幕上,同时您的应用程序继续执行其他操作。

    您必须在交互模式下使用 matplotlib。这可能是你的问题。

    from matplotlib import interactive
    interactive(True)
    

    这应该在导入的顶部

    【讨论】:

      【解决方案2】:

      这与 GIL 无关,只需修改您的分析代码,使其不时更新图表(例如每 N 次迭代)。

      只有这样,如果您发现绘制图表会使分析代码速度过慢,请将图表更新代码放在具有多处理功能的子进程中。

      【讨论】:

      • 我认为您没有理解我的意思。当绘图显示时,解释器停止,直到窗口关闭。在 show() 之前和之后放置一个 print 语句,你会看到......或者,如果我错了,你能否包含一些伪代码来说明绘图命令的正确使用(特别是在哪里放置 show() 方法打电话?
      • show(),正如文档所说,应该在你的脚本中只使用一次。您需要使用另一种方法来完成您想做的事情。例如,您可以将图形渲染为图像并使用外部程序(如 eog)显示它,或者如果您使用 GUI 渲染到像素图等...
      【解决方案3】:

      我认为您需要将图表放入适当的窗口系统中,而不是依赖内置的显示代码。

      也许将 .show() 粘贴在另一个线程中就足够了?

      GIL 无关紧要 - 你有一个阻塞的 show() 调用,所以你需要先处理它。

      【讨论】:

        【解决方案4】:

        似乎 draw() 方法可以绕过 show() 的需要。

        脚本中 .show() 的唯一原因是让它做阻塞部分,这样当脚本结束时图像不会消失。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-06-30
          • 1970-01-01
          • 1970-01-01
          • 2016-06-29
          • 2013-03-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多