我们最近将MongoDB从2.6更新到3.0。从那以后,我们在使用PyMongo和Multiprocessing时遇到了麻烦。
问题在于,某个进程中的操作(例如查找)有时会挂起约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 :(得分:0)
这是pymongo版本3.0.x中的错误。错误报告网址https://jira.mongodb.org/browse/PYTHON-961
此问题的解决方法。 (在pymongo 3.0.3中测试过) 在MongoClient对象初始化中传递“connect = False”
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()