当前位置: 首页 > 面试题库 >

为什么PyMongo 3提供ServerSelectionTimeoutError?

宇文飞羽
2023-03-14
问题内容

我正在使用:

  • 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 pm更新:

2。但是server_description.known_servers()服务器'myserver.mongolab.com‘的server_type
= 0

这将导致以下堆栈跟踪:

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的监视线程启动与多进程派生之间的竞争状态。



 类似资料:
  • 我使用GWT2.7,并希望在我的应用程序中提供带有级别信息和警告的日志记录。在我的gwt.xml文件中,我有: 它在开发模式下工作得很好,但在SuperDevMode中,我只能记录严重的日志级别。 为什么SuperDevMode只提供LogLevel严重?

  • 问题内容: 有人知道为什么JUnit 4提供但不提供方法吗? 它提供了(对应于)和(对应于),因此它们似乎没有包含在内就显得很奇怪。 顺便说一下,我知道JUnit插件提供了我正在寻找的方法。我只是出于好奇而问。 问题答案: 我建议您使用较新的样式断言,该断言可以轻松描述各种否定形式,并在断言失败时自动构建对您的期望和得到的结果的描述: 这三个选项都是等效的,请选择最容易阅读的一个。 要使用方法的简

  • 我很想知道为什么Java的可选不提供类似于流的方法。 接口的method javadoc声明: @apiNote此方法主要用于支持调试,您希望在元素流经管道中的某个点时看到这些元素 这几乎完全描述了我的用例: (返回 方法,上述所有内容都会转换为: 也可以这样做(参见此答案): 并将其与方法一起使用: 但我认为这是一个黑客,而不是的干净用法。 从Java 9开始,可以将< code>Optiona

  • 问题内容: 为什么列入成员的? 问题答案: 因为它在中,所以…。http : //tomoyo.sourceforge.jp/cgi- bin/lxr/source/arch/x86/include/asm/user_32.h#L77 因此,许多用户空间实用程序都希望在此处输入一个字段,因此也包含在其中(以与较早的调试器和rs 兼容) 下一个问题是“为什么将成员包括在其中?”。 它是在Linux

  • 为了防止实现细节泄漏,可以实现,而不是返回,然后需要从接口实现。因此,无论内部数据结构如何管理,对元素的访问都是通过进行的。 对于Java8,可能希望将添加到。(另请参阅《Java8lambdas》一书中关于支持的建议)。虽然添加方法并不困难(我也读过关于为什么Iterable不提供流的问题),但奇怪的是Java没有为添加接口来镜像思想。(好吧,可能有一个不同的名称,因为是为了永远使用CORBA的

  • 问题内容: 从C ++到Java,一个显而易见的未解决问题是Java为什么不包括运算符重载? 没有;比这简单;吗? 是否存在已知的原因,有效的论据,不使运算符重载?原因是任意的还是迷失了时间? 问题答案: 假设你想覆盖所引用的对象的先前值a,则必须调用成员函数。 在C ++中,此表达式告诉编译器在堆栈上创建三(3)个对象,执行加法,然后将结果值从临时对象复制到现有对象中。 但是,在Java中,不对