2016-11-28 21 views
4

私はPythonのマルチプロセッシングモジュールと一緒に使用しようとしているc-pointerを含むcythonで実装されたクラスを持っています。クラスはクラスのインスタンスを返すためにDLLファイルを受け取ります。Pickle Pythonマルチプロセッシングでのcythonクラス

インスタンスのデータ型は保持されていますが、空である、つまりすべてのクラス関数にアクセスできますが、入力前に設定したインスタンス値がすべて失われているという問題があります。 special_classを含むコードは非常に大きいので、私はそれを含めることができません。

import time 
import multiprocessing as mp 
from special_module import special_class 

def run_task(tasks,nr): 
    obj = tasks[nr]['data'] 
    print obj.get_name() 



if __name__ == "__main__": 

    m1 = special_class("a.dll") 
    m2 = special_class("b.dll") 


    tasks = dict() 

    tasks[1] = {'data': m1} 
    tasks[2] = {'data': m2} 


    process1 = mp.Process(target = run_task, name = 'process1', args = (tasks, 1)) 
    process2 = mp.Process(target = run_task, name = 'process2', args = (tasks, 2)) 

    process1.start() 

    time.sleep(0.2) 

    process2.start() 

    process1.join() 
    process2.join() 

上記のスクリプトは、私に出力

None 
None 

機能は、それが正常に動作しますrun_taskの内側に、私はインスタンスを作成する場合は、正しい出力が

name.a 
name.b 

のスタイルにする必要がありますを提供します私は、メインプロセスでインスタンスを作成して動作させる方法を探しています。これは可能ですか?

+0

[カスタムピックラーを使用してください](https://docs.python.org/3/library/copyreg.html)を参照してください。 – Phillip

+0

すべてのウィンドウ(OS) 'class access'はPython上の登録されたポイントを必要としました。あなたはDLLにアクセスするが、すべての 'データアクセス'プロシージャを設定する方法。 'pythoncom.CoInitialize()'を使う必要があります。 [これをチェック](http://stackoverflow.com/questions/26764978/using-win32com-with-multithreading) – dsgdfg

+1

Umm ... 'import special_class'の後に' m1 = special_class( "a.dll") 'isn ' t法律;モジュールを呼び出すことはできません。実際のコードでは少し違うと思いますが、いずれにせよ、ここではCythonクラスの定義が重要です。あなたはそれを省略できません。 – ShadowRanger

答えて

0

マルチプロセッシングライブラリは、オブジェクトを酸洗いし、データを他の生成されたプロセスにパイプすることによって機能します。問題は、special_classがunpicklableであることです。

私は関数の内部でインスタンスを作成する場合は、そのオブジェクトが問題を回避した、漬けする必要はありませんので、これは動作します

罰金を動作しますrun_task。


あなたはspecial_classをpicklableにする必要があります。これはさまざまな方法で行うことができます。これらはすべてここに記載されています:

  • あなたの場合(special_class__getstate____setstate__メソッドを実装special_class
  • __reduce__メソッドを実装し
  • Picklerさんのカスタムを使用してください:https://docs.python.org/3/library/pickle.html#pickle-inst

    は基本的には、3つのメカニズムがありますクラスインスタンスには州があります)

私はspecial_classに外部のオブジェクトへの参照があると感じています。その場合は、https://docs.python.org/3/library/pickle.html#persistence-of-external-objects

2

私はマルチプロセッシングを信じています。プロセスは、すべての引数をピクルスします。ですから、あなたは、Pythonにspecial_classをピクルする方法を伝える必要があります。データを適切に節約できるように、メソッドspecial_class .__ reduce__を実装するだけで済みます。あなたはm1m2両方フルspecial_classモジュールを作っているかのように

0

に思えます。あなたはそれら特定のクラスにしようとし、いずれかを実行している場合は、次の

(私はお勧め)
from special_class import * 

またはNoneはおそらく、あなたの入力m1m2にメソッドので、表示されている

m1 = special_class.special_class("a.dll") 
m2 = special_class.special_class("b.dll") 

何らかの理由でモジュールを受け入れることもできます。 from special_class import *を試してみることをお勧めします。

+0

いいえ、オブジェクトをピクルすることができないため、「なし」が表示されます。マルチプロセッシングモジュールを使用しないと、この問題は発生しません。 – Chicony

関連する問題