多处理/多线程 - 不提高速度 - Python

时间:2014-11-06 19:15:35

标签: python multithreading multiprocessing python-multiprocessing

我是多处理/多线程模块的新手,我试图检查它是否可以提高程序的速度。问题是它返回了意外的值。我也尝试了threading.Thread而不是multiprocessing.Process并且发生了同样的问题 - 它比没有使用另一个线程运行得慢。

在这个例子中我使用了多处理模块,但是当我尝试多线程时差异几乎相同(差异在评论中) 下面是两个函数在顺序运行时打印时间的代码,以及这些函数并行运行的时间:

import time
from threading import Thread
from multiprocessing import Process
import MyFile

    class PerformanceTesting:

        def __init__(self):
            self.clss = MyFile.MyClass('A')
            self.p1 = Process(target=self.f1) # I've tried also t1 = Thread(target=f1)
            self.p2 = Process(target=self.f2) # I've tried also t2 = Thread(target=f2)

        def f1(self):
            results = self.clss.doSomething(arg,arg)
            print results

        def f2(self):
            results = self.clss.doSomething(arg,arg)
            print results

    if __name__ == "__main__":
        perf = PerformanceTesting()

        # ATTEMPT USING MULTIPROCESSING
        start = time.time()
        perf.p1.start()
        perf.f2()
        perf.p1.join()
        print time.time()-start

        # ATTEMPT WITHOUT USING MULTIPROCESSING
        start = time.time()
        perf.f1()
        perf.f2()
        print time.time()-start

你能否告诉我是否有可能提高这个例子的速度? 我做错了什么?

我有一个想法:不是因为分成更多的进程或线程需要花费几秒钟,因此在一秒钟内返回结果的情况下它会有所帮助吗?

1 个答案:

答案 0 :(得分:0)

在这里有一些事情可以让我看到,至少对于你正在尝试做的事情:

perf.p1.start()
perf.f2()
perf.p1.join()

这将启动流程p1,然后执行f2,然后等待p1通过p1.join()完成。这似乎打败了多处理的目的 - 从你的帖子我假设你认为在一个单独的线程上运行一个进程使它变得更快 - 不幸的是,除非你在物理上获得更好的CPU,否则情况永远不会如此。

多处理的重点在于你的代码可以触发一个线程的start函数,然后在它完成之前忘记它,同时继续处理其他事情。重要的是,除非你开始将你的代码划分为许多不同的并行运行的部分,这样它们可以在个人基础上快速完成,所以你永远不会看到一个线程的速度增加。其他人在执行相同的代码时。

在这种情况下你可以做的是:

perf.p1.start()
perf.p2.start()
... do some more code, after which something happens when these two finish.

这将直接进入代码的下一部分而不等待你的函数完成,这将阻止函数阻塞主线程。您必须实现信号/插槽系统,以便在完成操作时实际触发操作。

希望这有帮助。