我正在尝试使用带有gevent的mongo引擎连接到mongo服务器。 pymongo documentation表示gevent支持非常简单。由于gevent发布1.0,上面链接的示例不适用于PyMongo MongoReplicaSetClient。
如果你打开一个python提示并尝试示例中的代码:
from gevent import monkey; monkey.patch_socket()
from pymongo.mongo_replica_set_client import MongoReplicaSetClient
rsc = MongoReplicaSetClient('mongodb://localhost:27017,localhost:27018,localhost:27019', replicaSet='repl0', use_greenlets=True)
print rsc
MongoReplicaSetClient([u'localhost:27017'])
我将此代码保存为名为connection.py的文件。如果我从命令行运行此文件,它可以正常工作。
$python connection.py
MongoReplicaSetClient([u'localhost:27017'])
但如果我尝试导入此模块,它永远不会返回。最后我必须按Ctrl-C:
$ python
Python 2.7.5 (default, May 21 2013, 14:51:47)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from ecs.db.mongo import connection
^CKeyboardInterrupt
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "ecs/db/mongo/connection.py", line 15, in <module>
c = MongoReplicaSetClient('mongodb://localhost/ecs', replicaSet='ecsReplicaSet', use_greenlets=True)
File "/home/daniels/.virtualenvs/parlant-ecs-env/lib/python2.7/site-packages/pymongo/mongo_replica_set_client.py", line 742, in __init__
self.refresh()
File "/home/daniels/.virtualenvs/parlant-ecs-env/lib/python2.7/site-packages/pymongo/mongo_replica_set_client.py", line 1179, in refresh
res, connection_pool, ping_time = self.__is_master(host)
File "/home/daniels/.virtualenvs/parlant-ecs-env/lib/python2.7/site-packages/pymongo/mongo_replica_set_client.py", line 1056, in __is_master
sock_info = connection_pool.get_socket()
File "/home/daniels/.virtualenvs/parlant-ecs-env/lib/python2.7/site-packages/pymongo/pool.py", line 339, in get_socket
sock_info, from_pool = self.connect(pair), False
File "/home/daniels/.virtualenvs/parlant-ecs-env/lib/python2.7/site-packages/pymongo/pool.py", line 265, in connect
sock = self.create_connection(pair)
File "/home/daniels/.virtualenvs/parlant-ecs-env/lib/python2.7/site-packages/pymongo/pool.py", line 237, in create_connection
for res in socket.getaddrinfo(host, port, family, socket.SOCK_STREAM):
File "/home/daniels/.virtualenvs/parlant-ecs-env/lib/python2.7/site-packages/gevent/socket.py", line 621, in getaddrinfo
return get_hub().resolver.getaddrinfo(host, port, family, socktype, proto, flags)
File "/home/daniels/.virtualenvs/parlant-ecs-env/lib/python2.7/site-packages/gevent/resolver_thread.py", line 34, in getaddrinfo
return self.pool.apply_e(self.expected_errors, _socket.getaddrinfo, args, kwargs)
File "/home/daniels/.virtualenvs/parlant-ecs-env/lib/python2.7/site-packages/gevent/threadpool.py", line 222, in apply_e
success, result = self.spawn(wrap_errors, expected_errors, function, args, kwargs).get()
File "/home/daniels/.virtualenvs/parlant-ecs-env/lib/python2.7/site-packages/gevent/event.py", line 226, in get
result = self.hub.switch()
File "/home/daniels/.virtualenvs/parlant-ecs-env/lib/python2.7/site-packages/gevent/hub.py", line 331, in switch
return greenlet.switch(self)
KeyboardInterrupt
我不确定我错过了什么,但是PyMongo和gevent 1.0似乎存在问题。这与gevent 0.13.8一起运行良好。
修改:我刚刚找到了this issue与pymongo解释问题并提供了一些工作。