我用的是:

  • Python 3.4.2
  • PyMongo 3.0.2
  • 蒙古德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']

我try 将JSON dict保存到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中的新线程模型吗?

Update:

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

Update 1/25 4:53pm EST:

在PyMongo中添加了一些调试之后,topology._update_servers()似乎知道服务器myserver-a.ab的服务器_type=2.com'.然而,对于服务器的myserver,server_description.known_servers()的server_type=0.蒙古拉布.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可以解决这个问题.这将延迟后台连接,直到try 第一次数据库操作,从而避免了我怀疑的MongoClient的监视器线程启动和多进程Forking 之间的竞争条件.

Mongodb相关问答推荐

MongoDB Aggregate:查找每个月的交叉日期范围的数量

我们可以在Mongoose中这样使用Unique:[True,";This to Unique&qot;]吗

在MongoDB Aggregate for My BooksDB中将`$match`放在`$unwin`之前或之后的区别

MongoDB 对特定搜索查询的响应时间较长

如何在 mongodb 查找的外键中使用正则表达式

mongo如何通过聚合加载嵌套文档

通过insertId MongoDB获取文档

mongoDB 过滤、排序和排名结果

更新 Mongodb 中的多嵌套数组

查找对象是否在预保存钩子mongoose中更改

你如何在 Kubernetes 上设置 Mongo 副本集?

mongodb 中的 --bindip 配置选项有什么作用?

mongodump 是否锁定数据库?

Java MongoDB/BSON 类混淆

Docker 内部的 Mongo 身份验证

如何返回 MongoDB 中文档的 ObjectId 或 _id?和错误$in 需要一个数组

使用已排序的数据获取不同的值

REACT 获取发布请求

使用 Node.js 将许多记录插入 Mongodb 的正确方法

聚合 $lookup 匹配管道中文档的总大小超过最大文档大小