ホームページ >バックエンド開発 >Python チュートリアル >マルチプロセッシングが「Can't Pickle InstanceMethod」で失敗するのはなぜですか?

マルチプロセッシングが「Can't Pickle InstanceMethod」で失敗するのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-12 22:05:14552ブラウズ

Why Does Multiprocessing Fail with

マルチプロセッシングでのエラー処理: "Can't Pickle InstanceMethod"

マルチプロセッシングでは、Pool.map() 関数はタスクをプロセス間で分割して同時実行します。ただし、次のコードに示すように、バインドされたメソッドを使用するとエラーが発生する可能性があります。

import multiprocessing

def f(x):
    return x*x

def go():
    pool = multiprocessing.Pool(processes=4)        
    print pool.map(f, range(10))


if __name__== '__main__' :
    go()

このコードはシームレスに動作します。ただし、よりオブジェクト指向のアプローチを使用すると、エラーで失敗する可能性があります:

PicklingError: Can't pickle <type 'instancemethod'>: attribute lookup
__builtin__.instancemethod failed

このエラーは、次のコードに示すように、バインドされたメソッドで Pool.map() を使用しようとすると発生します。

import someClass

if __name__== '__main__' :
    sc = someClass.someClass()
    sc.go()

class someClass(object):
    def __init__(self):
        pass

    def f(self, x):
        return x*x

    def go(self):
        pool = multiprocessing.Pool(processes=4)       
        print pool.map(self.f, range(10))

解決策:

この問題は、マルチプロセッシングの要件に起因します。オブジェクトを pickle にしてプロセス間で分散します。ただし、バインドされたメソッドは本質的に pickle 可能ではありません。解決策には、pickle を有効にするために必要なインフラストラクチャの作成が含まれます。

1 つのアプローチは、pickle 関数と unpickle 関数を登録するために copy_reg 標準ライブラリ メソッドを使用することです。たとえば、関連するディスカッション スレッドへの Steven Bethard の貢献は、copy_reg を使用したメソッドの pickle 化および unpickle 化のための実行可能なアプローチを提供しています。

以上がマルチプロセッシングが「Can't Pickle InstanceMethod」で失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。