我用的是:
- 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