2015-06-08 205 views
0

我們最近更新了MongoDB從2.6到3.0。從那以後,我們在使用PyMongo和Multiprocessing時遇到了麻煩。PyMongo和多處理:ServerSelectionTimeoutError

問題是,有時某個進程中的操作(例如find)會掛起約30秒,然後引發異常「ServerSelectionTimeoutError:尚未找到服務器」。

行爲似乎與輸入無關,因爲我們的腳本通常運行得很好,然後隨機掛起。

日誌文件不顯示任何與超時相關的條目,也沒有在Internet上找到有關此問題的任何有用信息。

腳本正在我們的測試環境中運行,這意味着沒有涉及副本集並且Mongo實例綁定到localhost。

下面是完整的堆棧跟蹤:

File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap 
    self.run() 
    File "somescript.py", line 109, in run 
    self.find_incoming_cc() 
    File "somescript.py", line 370, in find_incoming_cc 
    {'_id': 1, 'cc': 1} 
    File "/usr/local/lib/python2.7/dist-packages/pymongo/cursor.py", line 983, in next 
    if len(self.__data) or self._refresh(): 
    File "/usr/local/lib/python2.7/dist-packages/pymongo/cursor.py", line 908, in _refresh 
    self.__read_preference)) 
    File "/usr/local/lib/python2.7/dist-packages/pymongo/cursor.py", line 813, in __send_message 
    **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/pymongo/mongo_client.py", line 728, in _send_message_with_response 
    server = topology.select_server(selector) 
    File "/usr/local/lib/python2.7/dist-packages/pymongo/topology.py", line 121, in select_server 
    address)) 
    File "/usr/local/lib/python2.7/dist-packages/pymongo/topology.py", line 97, in select_servers 
    self._error_message(selector)) 
ServerSelectionTimeoutError: No servers found yet 

現在的問題:是否有任何已知問題/錯誤使用PyMongo有多重時?有沒有辦法來調試異常?

感謝您的幫助!

+0

你說你把MongoDB從2.6更新到3.0,我假設你還將PyMongo從某個版本升級到PyMongo 3?這是新的PyMongo代碼,而不是新的MongoDB版本,與此問題相關。在任何情況下,PyMongo和多處理都不存在已知的錯誤,請問您可以在jira.mongodb.com的PYTHON項目中打開一張票,我們來看一下嗎? –

回答

0

這是pymongo 3.0.x版中的bug。錯誤報告網址https://jira.mongodb.org/browse/PYTHON-961

解決此問題的方法。 (在pymongo 3.0.3測試) 通「連接=假」在MongoClient對象初始化

MongoClient(uri, connect=False) 

或等待幾秒鐘,在子進程中創建MongoClient的實例之前(如time.sleep(2)) 。

def start(uri): 
    time.sleep(2) 
    mclient = MongoClient(uri) 
    mclient.db.collection.find_one() 

if __name__ == '__main__': 
    p = multiprocessing.Process(target=start, args=('mongodb://localhost:27017/',)) 
    p.start()