系統轉移過程中,擅自把aptitude安裝的mongoengine換成了pip安裝,系統啟動以后,報這個錯誤
報錯提示:
- File "/usr/local/lib/python2.7/dist-packages/pymongo/mongo_client.py", line 748, in _socket_for_reads
- with self._get_socket(read_preference) as sock_info:
- File "/usr/lib/python2.7/contextlib.py", line 17, in __enter__
- return self.gen.next()
- File "/usr/local/lib/python2.7/dist-packages/pymongo/mongo_client.py", line 712, in _get_socket
- server = self._get_topology().select_server(selector)
- File "/usr/local/lib/python2.7/dist-packages/pymongo/topology.py", line 141, in select_server
- address))
- File "/usr/local/lib/python2.7/dist-packages/pymongo/topology.py", line 117, in select_servers
- self._error_message(selector))
- ServerSelectionTimeoutError: No servers found yet
因為是系統轉移,剛開始是以為mongodb服務器那邊服務的問題,后來上網查了一下,發現是pymongo的3.0.*以后版本接口向前兼容的一個bug,SoF某貼(地址見最后)提供了2個方案:
方案一,多傳一個connect=False的參數:
- MongoClient(uri, connect=False)
方案二、在初始化MongoClient實例之前,在子進程等幾秒,代碼如下:
- 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()
我的解決方案:雖然我用的不是上面任何方案的接口,我使用的是mongoengine的接口函數,底層任然是pymongo
- from mongoengine import connect
按照方案一,在這個connect原調用位置的參數里面加了connect=False,問題解決。
第二個問題,使用新版本pymongo以后出現的問題,錯誤提示:
- [Errno 104] Connection reset by peer
經SoF某貼,認為是mongodb的讀寫文件數超標了,其實我沒在mongodb的log里面找到相應信息,只是當時的確做了大數據量的mongodb讀寫操作,於是按照帖子的要求添加/etc/security/limits.d/mongodb.conf 文件,文件內容:
- mongodb hard nofile 99999
- mongodb soft nofile 99999
- mongodb hard nproc 99999
- mongodb soft nproc 99999
BugFix效果還待驗證
參考:SoF某貼:http://stackoverflow.com/questions/30710427/pymongo-and-multiprocessing-serverselectiontimeouterror