python - 为什么 PyMongo 3 给出 ServerSelectionTimeoutEr

我正在使用:

  • Python 3.4.2
  • PyMongo 3.0.2
  • mongolab 运行 mongod 2.6.9
  • uWSGI 2.0.10
  • CherryPy 3.7.0
  • nginx 1.6.2

uWSGI 启动参数:

--socket 127.0.0.1:8081 --daemonize --enable-threads --threads 2 --processes 2

我设置了我的 MongoClient 一次:

self.mongo_client = MongoClient('mongodb://user:pw@host.mongolab.com:port/mydb')
self.db = self.mongo_client['mydb']

我尝试将 JSON 字典保存到 MongoDB:

result = self.db.jobs.insert_one(job_dict)

它通过执行与 mongodb 相同的代码路径的单元测试来工作。但是,当我使用 HTTP POST 通过 CherryPy 和 uWSGI 执行时,我得到了:

pymongo.errors.ServerSelectionTimeoutError: No servers found yet

为什么我在通过 CherryPy 和 uWSGI 运行时会看到这种行为?这可能是 PyMongo 3 中的新线程模型吗?

更新:

如果我使用 CherryPy 内置服务器在没有 uWSGI 和 nginx 的情况下运行,则 insert_one() 可以工作。

更新 1/25 下午 4:53 EST:

在 PyMongo 中添加一些调试后,topology._update_servers() 似乎知道服务器“myserver-a.mongolab.com”的 server_type = 2。但是 server_description.known_servers() 的 server_type = 0 用于服务器 'myserver.mongolab.com'

这导致以下堆栈跟踪:

result = self.db.jobs.insert_one(job_dict)
File "/usr/local/lib/python3.4/site-packages/pymongo/collection.py", line 466, in insert_one
with self._socket_for_writes() as sock_info:
File "/usr/local/lib/python3.4/contextlib.py", line 59, in __enter__
return next(self.gen)
File "/usr/local/lib/python3.4/site-packages/pymongo/mongo_client.py", line 663, in _get_socket
server = self._get_topology().select_server(selector)
File "/usr/local/lib/python3.4/site-packages/pymongo/topology.py", line 121, in select_server
address))
File "/usr/local/lib/python3.4/site-packages/pymongo/topology.py", line 97, in select_servers
self._error_message(selector))
pymongo.errors.ServerSelectionTimeoutError: No servers found yet

最佳答案

我们正在调查此问题,在 PYTHON-961 中进行了跟踪.您可以通过在创建 MongoClient 实例时传递 connect=False 来解决此问题。这将后台连接推迟到尝试第一个数据库操作,避免我怀疑是 MongoClient 的监视线程启动和多进程 fork 之间的竞争条件。

关于python - 为什么 PyMongo 3 给出 ServerSelectionTimeoutError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31030307/

相关文章:

node.js - 具有一对多关系的 Mongoose 文档引用

mongodb - Mongoose 是否支持 Mongodb `findAndModify` 方法

node.js - 使用 2 个字段的 Mongoose 自定义验证

mongodb - 在 MongoDB 中存储 ObjectId 及其字符串形式之间的区别

python - 让 Spark、Python 和 MongoDB 协同工作

linux - Errr 'mongo.js:L112 Error: couldn' t 连接到服务

node.js - 使用 mongoose 在 mongodb 中设置集合的到期时间

mongodb - 我控制修补程序上的 Mongo 错误

node.js - 未找到匹配项的 Mongoose 查询返回什么?

mongodb - 如何使用 Robomongo 连接到 MongoDB Atlas?