マルチコアプロセッサで高速化するために、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日過ごした後、次にどこに移動すればよいかわからないので、助けてください。
私は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