[解決済み】Pythonマルチプロセッシング PicklingError: <type 'function'> をピクルスにできない。
質問
もっと簡単な例でエラーを再現することができず、また私のコードが複雑すぎて掲載できないのが残念です。通常のPythonの代わりにIPythonのシェルでプログラムを実行するとうまくいきます。
この問題についての過去のメモを調べてみました。それらはすべて、クラス関数内で定義された関数を呼び出すためにプールを使用することが原因でした。しかし、これは私の場合ではありません。
Exception in thread Thread-3:
Traceback (most recent call last):
File "/usr/lib64/python2.7/threading.py", line 552, in __bootstrap_inner
self.run()
File "/usr/lib64/python2.7/threading.py", line 505, in run
self.__target(*self.__args, **self.__kwargs)
File "/usr/lib64/python2.7/multiprocessing/pool.py", line 313, in _handle_tasks
put(task)
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
ご協力をお願いします。
更新情報
: 私がpickleした関数は、モジュールのトップレベルで定義されています。しかし、それはネストされた関数を含む関数を呼び出します。
f()
が呼び出す
g()
コール
h()
これは、ネストされた関数
i()
を呼び出しています。
pool.apply_async(f)
.
f()
,
g()
,
h()
はすべてトップレベルで定義されています。このパターンでもっと簡単な例を試してみましたが、うまくいきました。
解決方法は?
ここで 漬けられるものリスト . 特に、関数はモジュールのトップレベルで定義されている場合のみ pickl 可能です。
このコード片は
import multiprocessing as mp
class Foo():
@staticmethod
def work(self):
pass
if __name__ == '__main__':
pool = mp.Pool()
foo = Foo()
pool.apply_async(foo.work)
pool.close()
pool.join()
は、あなたが投稿したものとほとんど同じエラーを発生させます。
Exception in thread Thread-2:
Traceback (most recent call last):
File "/usr/lib/python2.7/threading.py", line 552, in __bootstrap_inner
self.run()
File "/usr/lib/python2.7/threading.py", line 505, in run
self.__target(*self.__args, **self.__kwargs)
File "/usr/lib/python2.7/multiprocessing/pool.py", line 315, in _handle_tasks
put(task)
PicklingError: Can't pickle <type 'function'>: attribute lookup __builtin__.function failed
問題は
pool
メソッドはすべて
mp.SimpleQueue
を使用してワーカープロセスにタスクを渡します。を経由するものはすべて
mp.SimpleQueue
はピッキング可能でなければならず
foo.work
は、モジュールのトップレベルで定義されていないため、picklableではありません。
この問題は、トップレベルで関数を定義し、その関数が
foo.work()
:
def work(foo):
foo.work()
pool.apply_async(work,args=(foo,))
注目すべきは
foo
はピッキング可能です。
Foo
はトップレベルで定義され
foo.__dict__
はピックル可能です。
関連
-
Python機械学習Githubが8.9Kstarsに達したモデルインタープリタLIME
-
Pythonの学習とデータマイニングのために知っておくべきターミナルコマンドのトップ10
-
[解決済み】お使いのCPUは、このTensorFlowバイナリが使用するようにコンパイルされていない命令をサポートしています。AVX AVX2
-
[解決済み】「RuntimeError: dictionary changed size during iteration」エラーを回避する方法とは?
-
[解決済み】pygame.error: ビデオシステムが初期化されていない
-
[解決済み】Python Error: "ValueError: need more than 1 value to unpack" (バリューエラー:解凍に1つ以上の値が必要です
-
[解決済み】Python - "ValueError: not enough values to unpack (expected 2, got 1)" の修正方法 [閉店].
-
[解決済み] Pythonで型をチェックする標準的な方法は何ですか?
-
[解決済み】なぜPythonはこのJSONデータをパースできないのですか?[終了] PythonがこのJSONデータをパースできないのはなぜですか?
-
[解決済み】マルチプロセッシングの Pool.map() で <type 'instancemethod'> を pickle できない。)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Pythonコンテナのための組み込み汎用関数操作
-
Python カメの描画コマンドとその例
-
[解決済み] [Solved] sklearn error ValueError: 入力に NaN、infinity または dtype('float64') に対して大きすぎる値が含まれている。
-
[解決済み】「RuntimeError: dictionary changed size during iteration」エラーを回避する方法とは?
-
[解決済み】Pythonスクリプトで「Expected 2D array, got 1D array instead: 」というエラーが発生?
-
[解決済み】syntaxError: 'continue' がループ内で適切に使用されていない
-
[解決済み】Pythonでgoogle APIのJSONコードを読み込むとエラーになる件
-
[解決済み】SyntaxError: デフォルト以外の引数がデフォルトの引数に続く
-
[解決済み】Flask ImportError: Flask という名前のモジュールがない
-
[解決済み】マルチプロセッシングの Pool.map() で <type 'instancemethod'> を pickle できない。)