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



我是多处理/多线程模块的新手,我正在尝试检查它是否可以提高程序的速度。问题是它返回了意外的值。我也尝试了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

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

我有一个想法:这难道不是因为划分成更多的进程或线程需要几秒钟的时间,所以在必须在一秒钟内返回结果的情况下它没有帮助吗?

这里有一些事情让我很反感,至少对于你想要做的事情来说:

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.

这将直接进入代码的下一部分,而无需等待函数完成,这将阻止函数阻塞主线程。你必须实现一个信号/插槽系统,才能在它们完成时真正触发一个操作。

希望这能有所帮助。

最新更新