2017-02-06 32 views
0

好,我是一個Java開發誰解決了使用Python 2.7Python的隊列提高全即使無限

基本上我用隊列從UDP端口接收的信息來創建應用程序,另一個進程負責拉這些值先前插入此隊列中。目前唯一的問題是,文檔(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 

Plataform:

進口平臺

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數據結構中。在underlying C source code for the deque以一看,我發現了deque的這種類型的定義:

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; 

特請注意,這條線:

Py_ssize_t maxlen; 

this PEP

新型Py_ssize_t被引入,其大小與編譯器的size_t類型相同,但是被簽名。

所以,我的猜測是你的編譯器的size_t類型是32位。一個有符號的32位整數的值範圍在-32,768到32,767之間,上限是程序拋出異常的地方。

你是否有機會使用32位Python? :)

+1

沿着我所想的方向行進。我只使用'multiprocessing'隊列,但即使在那裏有無限大小,我也沒有超過單個'put'的緩衝區。但是請注意,您提供的鏈接也適用於'multiprocessing.Queue()',失敗的地方是_silent_,而這是一個例外。仍然,沒有其他的東西:) – roganjosh

+0

@JGut 我已經編輯了關於我的Python平臺的信息的問題,感謝您的幫助! – Bevilaqua