PyMonogo + Gevent1.0 ReplicaSetClient永远不会返回

时间:2014-01-10 18:00:21

标签: python mongodb pymongo gevent

我正在尝试使用带有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解释问题并提供了一些工作。

0 个答案:

没有答案