0

次のコードは例外をスローし、Python 2.7 と 3.3 の両方で 123 を出力します。

from multiprocessing import Queue

class Pool(object):
    def __init__(self):
        self.q = Queue()

p = Pool()
p.q.put(p)
print(123)

ここで見られるように、実際にはある種の競合状態です。

yuv@yuvpad2:~/$ python3.3 t.py
123
Traceback (most recent call last):
  File "/home/yuv/Downloads/Python-3.3.0/Lib/multiprocessing/queues.py", line 249, in _feed
yuv@yuvpad2:~/$ 

完全なエラーは次のとおりでRuntimeError: Queue objects should only be shared between processes through inheritanceあり、トレースバックはそれがどのように/どこで発生するかをまったく説明していません。問題の原因は、Queue 内のオブジェクトが Queue を参照できないことです。私の実際の使用例は、実際にはワーカー オブジェクトとプール オブジェクトであり、ワーカーは作業が終了したことをプールの に報告しQueueます。だから私はワーカーが自分自身をワーカーに送り返したかったのQueueです。

私の場合はマルチスレッドがうまく機能しますが、使用しない理由Queue.Queueは、Python 2.7 に queue.get() が Ctrl-C を無視するバグがあるためです。

このパターンをきれいに行う方法はありますか?

実際の問題コードはコードパッドにあります

4

3 に答える 3

1

エラーが不平を言っているのはこれです:

p.q.put(p)

Queueここでは、 a を参照するオブジェクトをキューに入れようとしています。キューはプロセス間の通信に使用されます。これが機能する方法は、キューに入れようとするものをすべて酸洗いし、他のプロセスでそれを解凍することですが、 a を酸洗いすることQueueは不可能であり、意味さえありません。

そのため、キューをピクルしようとすると、前述のエラーが発生します。

>>> from multiprocessing import Queue
>>> q = Queue()
>>> import pickle
>>> pickle.dumps(q)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.2/multiprocessing/queues.py", line 77, in __getstate__
    assert_spawning(self)
  File "/usr/lib/python3.2/multiprocessing/forking.py", line 51, in assert_spawning
    ' through inheritance' % type(self).__name__
RuntimeError: Queue objects should only be shared between processes through inheritance

キューを使用してプロセス間でデータを共有する場合、次のようにします。

class Worker(multiprocessing.Process):
    queue = multiprocessing.Queue()
    def run(self):
        print(self.queue.get())
        ...

その他の例については、ドキュメントを確認してください

于 2013-04-25T11:59:47.807 に答える
0

これを行うにはいくつかの方法があると思いますが、何をしたくないのかを正確に知らなければ、1つを推奨するのは困難です.

最も簡単なのは、この目的のために 2 つの異なるキューを使用することだと思います。1 つは入ってくるワーカー用で、もう 1 つは完了したワーカー用です。

于 2013-04-25T11:49:39.830 に答える
0

トレースバックがコードの問題を示していない理由は、multiprocessing.Queueクラスがバックグラウンド スレッドを開始し、そのスレッドで例外が生成されているためです。次のトレースバックを取得します...

Traceback (most recent call last):
  File "/usr/lib/python2.7/multiprocessing/queues.py", line 266, in _feed
    send(obj)
  File "/usr/lib/python2.7/multiprocessing/queues.py", line 77, in __getstate__
    assert_spawning(self)
  File "/usr/lib/python2.7/multiprocessing/forking.py", line 51, in assert_spawning
    ' through inheritance' % type(self).__name__
RuntimeError: Queue objects should only be shared between processes through inheritance

...ラインによって開始されていると思われます...

p.q.put(p)

Pool...オブジェクトを含むオブジェクトをQueueに入れているようですがQueue、これは許可されていないため、エラーが発生します。

有用な解決策が必要な場合は、達成しようとしていることを正確に明確にするのに役立ちます。

于 2013-04-25T11:56:38.600 に答える