2

私はマルチプロセッシング/マルチスレッド モジュールが初めてで、プログラムの速度を改善できるかどうかを確認しようとしています。問題は、予期しない値を返すことです。threading.Thread代わりに試してみましたがmultiprocessing.Process、同じ問題が発生しました-別のスレッドを使用しない場合よりも実行が遅くなります。

この例では multiprocessing モジュールを使用しましたが、マルチスレッドを試してもほぼ同じです (違いはコメントにあります) 2 つの関数が順次実行されている時間と、これらの関数が並列に実行されている時間を出力するコードを次に示します。

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秒で返さなければならない状況では役に立たないのではないでしょうか?

4

1 に答える 1

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.

これにより、関数が終了するのを待たずにコードの次の部分に直接進み、関数がメイン スレッドをブロックするのを防ぎます。ただし、完了時に実際にアクションをトリガーするには、シグナル/スロット システムを実装する必要があります。

お役に立てれば。

于 2016-09-16T09:00:29.357 に答える