Python のマルチプロセッシング モジュールを利用しようとすると、「PicklingError: Can't pickle
Pickling について
Pickle は、オブジェクトを次の形式に変換するプロセスです。バイナリ ストリームなので、保存して後で再作成できます。マルチプロセッシングでは、タスクはキューを介してネットワーク上に送信されるため、タスクが pickle 可能である必要があります。
関数とトップレベルの定義
トップレベルで定義された通常の関数モジュールのモジュールは本質的に pickle 化可能です。ただし、クラス内で定義された関数や他のネストされた関数はそうではありません。これは、pickle 化中に発生する「グローバル」が、そのグローバルを作成したプロセスのグローバルと同じではない可能性があるためです。
Pickle 化できない関数の例
検討してくださいクラス メソッド内にネストされた関数を定義する次のコード:
class Foo: def g(self): def h(): pass h()
Calling pool.apply_async(Foo().g) は、入れ子関数 h がトップレベルで定義されていないため、「PicklingError」が発生します。
Solution
Toこの問題を解決するには、モジュールのトップレベルで関数を定義し、ネストされた関数内からそれを呼び出すだけです。例:
def g(foo): def h(): pass h() foo.work()
これで、pool.apply_async(g, args=(Foo(),)) は正しく機能します。
以上がPython マルチプロセッシングが「PicklingError: Can't pickle」で失敗する理由とその修正方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。