【问题标题】:PyMongo and Multiprocessing: ServerSelectionTimeoutErrorPyMongo 和多处理:ServerSelectionTimeoutError
【发布时间】:2015-08-22 23:53:06
【问题描述】:

我们最近将 MongoDB 从 2.6 更新到了 3.0。从那时起,我们在将 PyMongo 与 Multiprocessing 结合使用时遇到了麻烦。

问题在于,有时进程中的操作(例如查找)会挂起约 30 秒,然后引发异常“ServerSelectionTimeoutError: No servers found yet”。

该行为似乎与输入无关,因为我们的脚本通常可以正常运行几次,然后随机挂起。

日志文件没有显示任何与超时相关的条目,我也没有在 Internet 上找到任何有关此问题的有用信息。

脚本在我们的测试环境中运行,这意味着不涉及副本集,Mongo 实例绑定到本地主机。

这里是完整的堆栈跟踪:

   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 与多处理一起使用时是否存在任何已知问题/错误?有没有办法调试异常?

感谢您的帮助!

【问题讨论】:

  • 您说您将 MongoDB 从 2.6 更新到 3.0,我假设您也将 PyMongo 从某个版本升级到 PyMongo 3?与这个问题相关的是新的 PyMongo 代码,而不是新的 MongoDB 版本。在任何情况下,PyMongo 和多处理都没有已知的错误,请您在 jira.mongodb.com 的 PYTHON 项目中打开一张票,我们来看看?

标签: mongodb multiprocessing pymongo


【解决方案1】:

这是 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()

【讨论】:

    猜你喜欢
    • 2019-06-01
    • 2021-03-08
    • 2017-04-27
    • 1970-01-01
    • 2020-07-13
    • 1970-01-01
    • 2015-09-10
    • 2015-06-22
    • 1970-01-01
    相关资源
    最近更新 更多