使用gevent的mongoengine,如何关闭连接?
我在使用 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
。我也试过这个补丁,但对我没有帮助(除非我用错了)
2 个回答
更新: 这个问题在今年早些时候已经在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
这看起来是使用mongoengine的正确方法(假设你有一个默认的连接):
你可以用这行代码来开始一个请求:mongoengine.connection.get_connection('default').start_request()
然后用这行代码来结束这个请求:mongoengine.connection.get_connection('default').end_request()