web-dev-qa-db-ja.com

Python pathosによるマルチプロセッシング

マルチコアプロセッサで高速化するために、Pythonのpathosを使用して計算を個別のプロセスに指定しようとしています。私のコードは次のように編成されています:

class:
   def foo(self,name):
    ...
    setattr(self,name,something)
    ...
   def boo(self):
      for name in list:
         self.foo(name)

Multiprocessing.Poolの酸洗いに問題があったので、私は悲しみを試すことにしました。前のトピックで提案されているように、私は試しました:

import pathos.multiprocessing

しかし、エラーが発生しました:モジュールのマルチプロセッシングはありません-最新のバージョンのパスでは見つかりません。

次に、booメソッドを変更してみました。

def boo(self):
 import pathos
 pathos.pp_map.pp_map(self.foo,list)

これでエラーはスローされませんが、fooは機能しません。私のクラスのインスタンスには新しい属性がありません。 1日過ごした後、次にどこに移動すればよいかわからないので、助けてください。

15
user3708829

私はpathosの作成者です。上記のコードから何をしたいのかわかりません。しかし、私はいくつかの光を当てることができます。これはいくつかの同様のコードです:

>>> from pathos.multiprocessing import ProcessingPool
>>> class Bar:
...   def foo(self, name):
...     return len(str(name))
...   def boo(self, things):
...     for thing in things:
...       self.sum += self.foo(thing)
...     return self.sum
...   sum = 0
... 
>>> b = Bar()
>>> results = ProcessingPool().map(b.boo, [[12,3,456],[8,9,10],['a','b','cde']])
>>> results
[6, 4, 5]
>>> b.sum
0

したがって、上記で何が起こるかは、booインスタンスのBarメソッドbが呼び出され、b.booが新しいpythonプロセスし、ネストされた各リストに対して評価されます。結果は正しいことがわかります…len( "12")+ len( "3")+ len( "456")は6などです。 。

ただし、b.sumを見ると、不思議なことに0であることがわかります。なぜb.sumがまだゼロなのですか?さて、multiprocessing(したがってpathos.multiprocessing)も何をするか、[〜#〜] copy [〜#〜]他のpythonプロセス…)にマップを渡した後、コピーされたインスタンスが(並行して)呼び出され、呼び出されたメソッドによって呼び出された結果を返します。 [〜#〜] return [〜#〜]結果を出力するか、結果を印刷するか、ログに記録するか、ファイルに送信するか、その他の方法で行う必要があります。他のプロセッサに送信されるのは元のインスタンスではないため、期待どおりに元のインスタンスに戻ることはできません。インスタンスのコピーが作成され、破棄されます-それぞれにsum属性は増加しましたが、元の `b.sum 'はそのままです。

ただし、pathos内には、上記のようなものを期待どおりに機能させる計画があります。元のオブジェクト[〜#〜]は[〜#〜]更新されましたが、まだそのようには動作しません。

EDIT:pipを使用してインストールする場合、pathosの最新リリースバージョンは数年前のものであることに注意してください。正しくインストールされない場合や、すべてのサブモジュールがインストールされない場合があります。新しいpathosリリースは保留中ですが、それまでは、githubからコードの最新バージョンを入手して、そこからインストールすることをお勧めします。トランクは大部分が開発中です。インストールに「新しい」pip-「古い」pathosの非互換性があるため、一部のパッケージがインストールされなかったことが問題の原因だったと思います。 pathos.multiprocessingがない場合は、これが最も可能性の高い原因です。

こちらのgithubからpathosを取得: https://github.com/uqfoundation/pathos

27
Mike McKerns