2016-11-15 25 views
0

私は異なるプロセスが呼び出せる共有関数を実行しようとしています。見つかった唯一の方法は、この関数を含むクラスを作成することです(this previous question参照)。しかし、今私が直面している問題は、プロセスが何かを待っているように見えることで、単一の論理コアの力だけを使用することです(イメージ参照)。マルチプロセスは単一の論理コアを使用しているようです

私は次のコードで同じ問題を再現するために成功しました(それが簡素化されました):

#!/usr/bin/python 

from multiprocessing import Pool 
from multiprocessing.managers import BaseManager 
from itertools import repeat 

class FunctionManager(BaseManager): 
    pass 

class MaClass: 
    def maFunction(self, val): 
     print(str(val)) 
     for i in range(0, 10000): 
      for j in range(0, 10000): 
       for k in range(0, 10000): 
        pass 

FunctionManager.register('MaClass', MaClass) 

myManager = FunctionManager() 
myManager.start() 
monObjet = myManager.MaClass() 

p = Pool() 
p.imap_unordered(monObjet.maFunction, range(10)) 
p.close() 
p.join() 

myManager.shutdown() 

HTOP CPU USAGE

任意のアイデア?

+0

Pythonは(まだ)サポートしていません。真のマルチスレッド並列実行* 1つのインタプリタインスタンス内*。いくつかのPythonインタプリタを起動して、複数のスレッドがお互いをブロックせずに同時に実行されているコンテキストを実現することができます。 – Ukimiku

+0

@Ukimiku彼は 'multiprocessing'モジュールを使用しています。 – tdelaney

+0

スレッドではなく_processes_です。それは正常に動作するようです。しかし、10のプロセスでは、それぞれ100%のCPUで実行するために10個のコアが必要です。 –

答えて

2

monObjectは通常のクラスインスタンスではなく、そのインスタンスのプロキシ<class 'multiprocessing.managers.AutoProxy[MaClass]'>です。子プロセスがそのプロキシを呼び出すと、その要求は処理された親に戻ります。プロキシを実行するバックグラウンドスレッドはGILの影響を受けますので、何個の子プロセスが呼び出しても、一度にこれらのスレッドのうちの1つしか実行できません。

プール内でプロキシメソッドを実行するのは珍しいことです。私はあなただけの例を調理してきたし、本当に親にメソッドを実行する必要があることを理解されよが、ここでは子供に仕事を続けるストローマンの一例である

#!/usr/bin/python 

from multiprocessing import Pool 

def worker(val): 
    c = MaClass() 
    return c.maFunction(val) 

class MaClass: 
    def maFunction(self, val): 
     print(str(val)) 
     for i in range(0, 10000): 
      for j in range(0, 10000): 
       for k in range(0, 10000): 
        pass 

p = Pool() 
p.imap_unordered(worker, range(10)) 
p.close() 
p.join() 
+0

ありがとう、私はあなたにもっとアップフォートを与えたいと思います。 maFunction()を呼び出す前に、クラスインスタンス "c"を追加するのを忘れてしまっただけです。 –

+0

@ MrG0z - ありがとう – tdelaney

関連する問題