2017-02-06 2 views
0

まあ、私は基本的に私は、UDPポートからの情報を受信するためにキューを使用していますが、別のプロセスが引っ張って責任があるのpython 2.7Pythonのキューがいっぱいに上げた場合にも無限の

を使用してアプリケーションを作成することを決議したJava開発者ですこれらの値は以前にこのキューから挿入されました。これまでのところ唯一の問題は、唯一の問題は、文書(https://docs.python.org/2/library/queue.html)によれば、無限のキューが目標とされている場合、基本的にキューをインスタンス化するときにパラメータ< = 0を送信する必要があります(たとえばQueue.Queue(maxsize = 0)私のキューが約32766の値で構成されているときに、完全な例外がスローされる/発生します..

誰でも私に教えてください。

while True: 
     try: 
      self.queue.put(valueToInsertIntoQueue, block=False) 
      break 
     except Full: 
      print('WHYYY? Queue is supposed to be infinite, at least until my memory blows...') 
      continue 

トレースバック:

Traceback (most recent call last): 
    File "MyFile.py", line 71, in inserValueIntoQueue 
    self.queue.put(valueToInsertIntoQueue, block=False) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/queues.py", line 155, in put 
    return self.put(obj, False) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/queues.py", line 102, in put 
    raise Full 
Full 

厚底:

インポート・プラットフォーム

platform.architecture()

(「64」、「」)

+0

'valueToInsertIntoQueue'は常に同じサイズですか? – roganjosh

+0

valueToInsertIntoQueueは、キーと値の辞書(UDPソケットはjson形式のメッセージを取得しています)を含むオブジェクトです。 – Bevilaqua

答えて

2

うーん、それは約2^15で失敗だという事実 - 1は、キュー内の基本的な変数と間違って何かだと信じるように私をリード。ちょっとした研究をした後、パイプに何か問題があると思われますが、私は100%確実ではありません。ここでは便利かもしれないリンクのカップルです:完全には答えていないため

http://bugs.python.org/issue8426

http://bugs.python.org/issue8237

申し訳ありませんが - 私はコメントしているだろうが、私は十分な評判を持っていない


編集:私はsource code for multiprocessing queuesを見ました。

Pythonのマルチプロセッシングキューの値は、Python Dequeデータ構造体に格納されます。

this PEPによる

Py_ssize_t maxlen; 

新しいタイプPy_ssize_t型:具体的には、このラインに気づく

typedef struct { 
    PyObject_VAR_HEAD 
    block *leftblock; 
    block *rightblock; 
    Py_ssize_t leftindex;  /* 0 <= leftindex < BLOCKLEN */ 
    Py_ssize_t rightindex;  /* 0 <= rightindex < BLOCKLEN */ 
    size_t state;    /* incremented whenever the indices move */ 
    Py_ssize_t maxlen; 
    PyObject *weakreflist; 
} dequeobject; 

underlying C source code for the dequeを見てみると、私はデックのため、このタイプの定義に気づきましたコンパイラのsize_t型と同じサイズを持ちますが、署名されています。

私の推測では、コンパイラのsize_t型は32ビットであると考えられます。符号付き32ビット整数は、-32,768〜32,767の範囲の値を持ちます。上限は、プログラムが例外をスローする場所です。

32ビット版のPythonを使用していますか? :)

+1

私が考えていた行に沿って。私は 'マルチプロセッシング'キューのみを使用しましたが、そこに無限のサイズがあっても、私は単一の 'put'のバッファを超えてしまいました。しかし、あなたが提供したリンクも 'multiprocessing.Queue()'のためのものであり、失敗は_silent_ですが、これは例外を出しています。それでもまだまだ続きます:) – roganjosh

+0

@JGut 私はPythonプラットフォームに関する情報を編集しました。ありがとうございます! – Bevilaqua

関連する問題