首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在tornado IOLoop上插入txyam

如何在tornado IOLoop上插入txyam
EN

Stack Overflow用户
提问于 2012-10-22 17:22:59
回答 1查看 247关注 0票数 1

我曾尝试使用tornado.platform.twisted集成txyam memcached客户端,但当我尝试检查它的功能时,抛出了下一个错误:

代码语言:javascript
复制
Traceback (most recent call last):
File "swcomet/tx_memcache_helper.py", line 32, in <module>
mem_helper = MemcacheHelper()
File "swcomet/tx_memcache_helper.py", line 19, in __init__
self.add(4)
File "/home/rustem/work/sw.services.swcomet.python/venv/local/lib/python2.7/site-packages/tornado/gen.py", line 117, in wrapper
gen = func(*args, **kwargs)
File "swcomet/tx_memcache_helper.py", line 25, in add
self.mem.getPickled(user_id, decompress=True)
File "/home/rustem/work/sw.services.swcomet.python/venv/lib/python2.7/site-packages/txyam/client.py", line 133, in getPickled
return self.get(key, **kwargs).addCallback(handleResult, uncompress)
File "/home/rustem/work/sw.services.swcomet.python/venv/lib/python2.7/site-packages/txyam/client.py", line 27, in wrapper
func = getattr(self.getClient(key), cmd)
File "/home/rustem/work/sw.services.swcomet.python/venv/lib/python2.7/site-packages/txyam/client.py", line 48, in getClient
raise NoServerError, "No connected servers remaining."

txyam.client.NoServerError:没有剩余的已连接服务器。

转储该错误的源代码:

代码语言:javascript
复制
import tornado.ioloop
import tornado.gen
from txyam.client import YamClient
from swtools.date import _ts
import tornado.platform.twisted

MEMHOSTS = ['127.0.0.1111']
USER_EXPIRATION_TIME = 61


class MemcacheHelper(object):
   def __init__(self, *a, **kw):
     try:
        self.mem = YamClient(["127.0.0.1"])
     except Exception, e:
        print "ERror", e
     self.clients = set()
     self.add(4)

  @tornado.gen.engine
  def add(self, user_id, expire=None):
     self.clients.add(user_id)
     expire = expire or USER_EXPIRATION_TIME
     self.mem.getPickled(user_id, decompress=True)
     print "hmmm"

  if __name__ == '__main__':
    print "trying to start on top of IOLOOP"
    ioloop = tornado.ioloop.IOLoop.instance()
    #reactor = TornadoReactor(ioloop)
    mem_helper = MemcacheHelper()
    #mem_helper.add(4)
    ioloop.start()

请帮我解决这个问题!

EN

回答 1

Stack Overflow用户

发布于 2012-10-22 20:33:32

在至少建立了一个连接之前,txyam似乎不允许您执行任何memcache操作:

代码语言:javascript
复制
def getActiveConnections(self):
    return [factory.client for factory in self.factories if not factory.client is None]


def getClient(self, key):
    hosts = self.getActiveConnections()
    log.msg("Using %i active hosts" % len(hosts))
    if len(hosts) == 0:
        raise NoServerError, "No connected servers remaining."
    return hosts[ketama(key) % len(hosts)]

它尝试立即建立这些连接:

代码语言:javascript
复制
def __init__(self, hosts):
    """                                                                                                                                                                                       
    @param hosts: A C{list} of C{tuple}s containing hosts and ports.                                                                                                                          
    """
    self.connect(hosts)

但是连接设置是异步的,并且它不会公开一个事件来指示何时至少建立了一个连接。

因此,您的代码会失败,因为您在任何连接存在之前立即调用了add。一个很好的长期修复方法是针对txyam提交一份bug报告,因为这不是一个非常好的界面。YamClient可以有一个whenReady方法,该方法返回一个Deferred,当您被实际允许使用YamClient实例时会触发该方法。或者,也可以有一个替代构造函数,它返回与YamClient实例一起触发的Deferred,但仅在可以使用它之后。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13008322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档