3

マルチプロセッシングを使用すると、次のエラーが発生します。

Exception in thread Thread-2:
Traceback (most recent call last):
  File "/usr/lib/python2.6/threading.py", line 525, in __bootstrap_inner
    self.run()
  File "/usr/lib/python2.6/threading.py", line 477, in run
    self.__target(*self.__args, **self.__kwargs)
  File "/usr/lib/python2.6/multiprocessing/pool.py", line 282, in _handle_results
    task = get()
UnpicklingError: NEWOBJ class argument has NULL tp_new

Cレベルで何かがおかしいように聞こえますが、これが何を意味するのかまったくわかりません。誰でもこれに光を当てることができますか?

更新:わかりましたので、これを修正する方法を見つけました。しかし、私はまだ少し困惑しています。私はこのクラスのインスタンスを返しています:

class SpecData(object):
    def __init__(self, **kwargs):
        self.__dict__.update(**kwargs)
    def to_dict(self):
        return self.__dict__

このオブジェクトのインスタンスを返すと、エラーが発生します。ただし、to_dict辞書を呼び出して返すと、機能します。私は何を間違っていますか?

4

3 に答える 3

3

pickleモジュールではなくモジュールを使用してみてくださいcPickle--pickleは純粋な Python で記述されており、多くの場合、より有用なエラー メッセージが表示されますcPickle。(ただし、問題を解決するために、 のローカル コピーを作成しpickle.py、エラーの場所の近くにいくつかの debug printf ステートメントを追加する必要があったこともあります。)

問題を突き止めたら、cpickle に戻すことができます。

(私は multiprocessing モジュールにあまり詳しくないので、あなたが pickle 化を行っているかどうかはわかりません。そうである場合、cpickle ではなく pickle を使用する最も簡単な方法は、次のようにすることです。マルチプロセッシング/スレッドモジュールをインポートする前に、モンキーパッチを適用してくださいimport sys, pickle; sys.modules['cPickle']=pickle:)

于 2009-12-30T16:22:06.097 に答える
2

これは、一部の python 関数の選択可能性/非選択可能性の問題だと思います。この投稿を参照してください。

http://khinsen.wordpress.com/2012/02/06/teaching-parallel-computing-in-python/

django-celery (マルチプロセッシング モジュールを使用) を使用して同様の問題が発生しました。自分のタスク コードで、それ自体は pickel 化できないエラーが発生した場合、このマルチプロセス/pickle 例外によって情報がわかりにくくなります。エラーを伝播するためのより良い方法を見つけられなかったため、タスク コードでログをデバッグして、エラーを追跡することにしました。おそらく、キューに渡すものについてもっと賢くする必要があります(メッセージキューに例外を入れないように注意してください。これにより、マルチプロセスモジュールはそれらをピクル/アンピクルしようとしません)。

上記の場合、SpecData.__dict__ピッケル可能であることを確認する必要がある場合があります。http://docs.python.org/library/pickle.html#pickle-protocolを参照してください

于 2012-10-22T23:35:05.817 に答える
0

私は C++、Java、および Delphi でスレッド セーフを行ってきましたが、Python では行っていません。

Python とスレッド セーフに関するこのページでは、ディクショナリをアトミックかつスレッド セーフにすることについて特に言及しています。おそらく、カスタム クラスへの参照はスレッド セーフではありませんか? それでも 2 つのスレッド間でカスタム コンテナ クラスを渡したい場合は、推奨されるロック メカニズムをいくつか追加してみてください。

他の検索結果で、Python が完全にスレッドセーフであることが強調されているのは興味深いことです。 Python のドキュメント自体は、スレッド化されたアプリケーションを支援するためにロックやその他のメカニズムが提供されていると述べているため、インターネットが間違っている場合のようです (それは起こりますか??)。

python と thread-safety に関する別の StackOverflow の質問

于 2009-12-23T15:22:42.633 に答える