PyMongo和Multiprocessing:ServerSelectionTimeoutError

时间:2015-06-08 13:28:33

标签: mongodb multiprocessing pymongo

我们最近将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进行多处理时是否存在任何已知问题/错误?有没有办法调试异常?

感谢您的帮助!

1 个答案:

答案 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()