1

tornado.platform.twisted を使用して txyam memcached クライアントを統合しようとしましたが、機能しているかどうかを確認しようとすると、次のエラーがスローされます。

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: 接続されているサーバーが残っていません。

そのエラーをダンプするソース コード:

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()

この問題を解決するのを手伝ってください!

4

1 に答える 1

1

txyam では、少なくとも 1 つの接続が確立されるまで、memcache 操作を実行できないようです。

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)]

これらの接続をすぐにセットアップしようとします。

def __init__(self, hosts):
    """                                                                                                                                                                                       
    @param hosts: A C{list} of C{tuple}s containing hosts and ports.                                                                                                                          
    """
    self.connect(hosts)

ただし、接続のセットアップは非同期であり、少なくとも 1 つの接続がいつ確立されたかを示すイベントを公開しません。

addしたがって、接続が存在する前にすぐに呼び出すため、コードは失敗します。txyam はあまり優れたインターフェイスではないため、txyam に対してバグ レポートを提出することをお勧めします。 実際にインスタンスの使用が許可されたときに起動するa を返すメソッドをYamClient持つことができます。または、インスタンスで起動するa を返す代替コンストラクターが存在する可能性がありますが、それは使用可能になった後でのみです。whenReadyDeferredYamClientDeferredYamClient

于 2012-10-22T12:33:32.020 に答える