ホームページ > バックエンド開発 > Python チュートリアル > Python マルチプロセッシングが「PicklingError: Can't pickle」で失敗する理由とその修正方法

Python マルチプロセッシングが「PicklingError: Can't pickle」で失敗する理由とその修正方法

Barbara Streisand
リリース: 2024-12-08 20:33:12
オリジナル
345 人が閲覧しました

Why Does Python Multiprocessing Fail with

「PicklingError: Pickle できません 」のトラブルシューティングPython マルチプロセッシング

Python のマルチプロセッシング モジュールを利用しようとすると、「PicklingError: Can't pickle 」というエラーが発生する場合があります。エラー。これは、モジュールのトップレベルで定義されていない関数を 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート