如何适当地使用QThreadPool进行多次大规模计算任务?

时间:2016-05-29 19:06:12

标签: python multithreading pyqt4

我正面临一个应该易于解决的问题,但我觉得我在黑暗中轻拍。我正在编写一个简单的框架,其中包含以下类:

首先是一个算法类,它只包含数值过程:

<video src="media/bunny.mp4" width="400" height="222" controls poster="media/bunny.jpg"></video>

然后,有一个项目类,它包含文件,实用程序和状态信息的路径。 Worker类子类QRunnable:

class Algorithm(object):
.
.
.
@staticmethod
def calculate(parameters):
    #do stuff
    return result

在Manager类中,进程已启动

class Worker(QRunnable):
    def __init__(self,item,*args,**kwargs):
        self.item = item
    def run(self,*args,**kwargs):
        result = Algorithms.calculate(items.parameter)
        item.result = result

现在问题:这样做之后我注意到两件事:

  • 工作不是更快(甚至有点慢)然后用1个线程
  • 完成
  • 项目获得相同的结果!例如,结果A,即项目A的正确结果,将被分配给所有项目!

我找不到很多文件,所以我哪里出错?

一切顺利 Twerp

1 个答案:

答案 0 :(得分:1)

最常见的Python(CPython)实现的一个限制是它的解析器使用Global Interpreter Lock,这意味着一次只有一个线程可以解析Python字节。多个Python线程可以同时执行基于C的Python子例程,并且多个Python线程可以同时等待I / O,但不能让它们同时执行Python代码。因此,在多线程处理CPU绑定的Python程序时,通常不会看到任何加速。常见的解决方法是生成子进程而不是线程(因为每个子进程将使用自己的Python解释器副本,它们不会相互干扰),或者重写部分或全部Python程序另一种没有这种限制的语言。