【问题标题】:Multiprocessing vs multithreading多处理与多线程
【发布时间】:2014-10-18 20:49:03
【问题描述】:

我有一个 GUI,只需单击一个按钮,我就必须开始一个大计算。

我在 python 2.7 中使用 QtDesigner

一开始,我遇到的问题是我的 GUI 在大计算工作时变得无响应。

我使用线程模块解决了这个问题:

class myMainWindow(QtGui.QMainWindow):

    def __init__(self, parent=None):
        #rest of the code here

class heavyCalculations(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        #rest of the code here

我现在的疑问是:假设我要开始 4 个繁重的计算,并且我想使用我的计算机的所有 4 个内核按时工作。为此我将需要多处理,但我应该怎么做才能避免我的 GUI 变得无响应,但同时按时使用 4 个内核?

据我所知,如果我为每个繁重的计算启动一个新进程,它确实可以并行工作,但我的 GUI 变得无响应。

如果我启动 4 个线程,它也可以工作并且 GUI 不受影响,但这不是真正的并行。

有什么帮助吗?

【问题讨论】:

  • 为什么你认为线程不是并行的?
  • 线程不是并行的,处理器从一个跳到另一个的速度非常快,假装是“并行的”,但是如果我们在 4 个进程按时在 4 个内核上工作时调用并行,则它不是并行的。不一样。
  • 我可以通过多线程让所有内核达到 100%,所以我认为一个进程!= 一个内核
  • 由于其GIL,Python实际上并不支持原生多线程,因此,为了使用多核,需要多个进程
  • 恐怕不会像那位朋友那样工作¡¡, 如果负载很高,当然有更多的核心即使有线程也能工作,但如果你想在低负载的情况下全部加载,你去多处理,实际上多处理的性能更好......但无论如何,让我们等待更多答案,我可能错了......我没有在线程上工作太多。

标签: python multithreading multiprocessing


【解决方案1】:

如果您不希望计算进程减慢 GUI 进程,则应确保 GUI 进程以高于计算进程的优先级运行。这样,每当有一个核心争用时(即,当同时要运行的进程多于您的计算机的 CPU 核心来运行它们时),GUI 进程将获得第一个 dib,计算过程将不得不等到GUI 已经完成了它想做的任何事情。

实现这一目标的最简单方法是让您的计算过程在开始计算之前首先降低自己的优先级。至于如何让Python进程降低其优先级,见here

【讨论】:

  • 谢谢,听起来不错,我需要测试一下。还有一件事......我还需要运行线程和进程还是只需要进程?我的意思是,如果顺序应该是:选项1:MainWindow----->为每个繁重的计算运行一个线程--->每个线程运行一个进程。或者选项2:MainWindow--->为每个繁重的计算运行一个进程。谢谢。
  • 只需处理就足够了。我不确定有一个线程来监控每个子进程会增加什么优势;我从来没有觉得有必要。
猜你喜欢
  • 2011-09-17
  • 2019-07-14
  • 1970-01-01
  • 2020-05-18
  • 2019-09-04
  • 2022-08-16
  • 1970-01-01
  • 2019-11-27
相关资源
最近更新 更多