繁体   English   中英

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

[英]Multiprocessing/Multithreading - does not improve speed - 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.join()等待p1完成。 这似乎违反了多处理的目的-从您的帖子中,我认为您认为在单独的线程上运行进程会使进程更快-不幸的是,除非您从物理上获得了更好的CPU,否则永远不会这样。

多重处理的要点是,您的代码可以触发线程的start函数,然后将其忽略,直到完成为止,与此同时继续进行其他操作。 重要的是,除非您开始将代码分成多个并行运行的不同部分,以便它们可以分别快速完成,否则在执行该代码时,您将永远看不到特别是一个线程的速度提高。相同的代码。

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

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

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

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM