使用gevent的mongoengine,如何关闭连接?

3 投票
2 回答
1497 浏览
提问于 2025-04-17 04:23

我在使用 gevent 进程时,尝试执行 MyApp.objects.get(foo=bar) 时遇到了 connection refused because too many open connections: 204 的错误。在 models.py 文件中,我有 connect('my_db')。在我的脚本中,我执行了 gevent.monkey.patch_all()。我看到过这个问题

pymongo + gevent: throw me a banana and just monkey_patch?

还有这个问题

https://github.com/hmarr/mongoengine/issues/272

但我不明白怎么才能访问连接来调用 end_request。我也试过这个补丁,但对我没有帮助(除非我用错了)

https://gist.github.com/1184264

2 个回答

0

更新: 这个问题在今年早些时候已经在pymongo中解决了。确保你使用的是最新版本的pymongo。

原始回答:

显然,你可以通过使用一个“代理类……来排队请求给工作者,它们根据需要分配新的PyMongo连接,在连接错误时丢弃它们,等等,并调用目标方法”,具体描述可以在这里找到:

http://groups.google.com/group/gevent/browse_thread/thread/a423d1a15d83f73c

(请查看2011年8月31日Antonin Amand的帖子和Alexey Borzenkov的回复)

附言:无论如何,MongoDB的团队正在努力解决这个问题:https://jira.mongodb.org/browse/PYTHON-296

0

这看起来是使用mongoengine的正确方法(假设你有一个默认的连接):

你可以用这行代码来开始一个请求:mongoengine.connection.get_connection('default').start_request()

然后用这行代码来结束这个请求:mongoengine.connection.get_connection('default').end_request()

撰写回答