【发布时间】:2015-09-10 21:02:54
【问题描述】:
我正在使用:
- 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
【问题讨论】:
-
我在类似的设置上也遇到了这个问题。你找到答案了吗?
-
什么都没有……还没有回到调试阶段。
-
要我开始赏金吗?您可以回答后续问题吗?我自己完全陷入了这个困境。
-
这个有用吗? blog.fejes.ca/?p=2496我不确定它如何应用于 uwsgi?
-
赏金会很棒。我尝试在 mongodb google 组中发帖,但我的问题从未发布。
标签: python mongodb uwsgi mlab pymongo-3.x