gpt4 book ai didi

redis - 我如何以扭曲的工厂方法访问redis?

转载 作者:可可西里 更新时间:2023-11-01 11:24:19 25 4
gpt4 key购买 nike

我正在使用 Redis 来跟踪所有连接的客户端/设备。套接字服务器是用 Twisted 编写的。由于redis的状态必须在运行socket server之前进行初始化,并在从OS获得TERM信号后进行同步。我想实现两个工厂方法。

我尝试实现如下代码。但失败了。

import txredisapi as redis
from twisted.internet import defer

conf = EpicConf().loadConf()
dbid = string.atoi(conf['Redisdbid'])
rcs = redis.lazyConnection(password=conf['RedisPassword'], dbid=dbid, reconnect=True)
dbpool = adbapi.ConnectionPool("MySQLdb",db=conf['DbName'],user=conf['DbAccount'],\
passwd=conf['DbPassword'],host=conf['DbHost'],\
use_unicode=True,charset=conf['DbCharset'],cp_reconnect=True)

class PlainTCP(protocol.Protocol, TimeoutMixin):
global conf

def __init__(self, factory):
self.factory = factory

class PlainTCPFactory(protocol.Factory):
global conf
onlineDevices = 'GlinkOnlineDevices'
timezone = 8 # for CST +8

def __init__(self):
global conf
print "Info: Version={}, TimeOutIdle={}".format(__version__, conf['TimeOutIdle'])

def buildProtocol(self, addr):
return PlainTCP(self)

#@defer.inlineCallbacks
def startFactory(self):
#global rcs
print "beforeRunning(): clean redis for running"
#yield rcs.delete(self.onlineDevices)

#@defer.inlineCallbacks
def stopFactory(self):
#global rcs
print "afterRunning(): load from redis for logging"
#yield rcs.delete(self.onlineDevices)

def main():
#or another init redis operations here
reactor.listenTCP(6000, PlainTCPFactory(), interface="0.0.0.0")
reactor.run
#or another sync redis operations here

if __name__ == "__main__":
main()

从代码片段中,您可以看到我尝试在两个工厂方法中添加代码:

  • 启动工厂()
  • 停止工厂()

但是如果我取消对 startFactory() 的注释,@defer.inlinecallbacks 和 yield 将抛出如下错误:

        Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/Twisted-15.0.0-py2.7-linux-i686.egg/twisted/internet/defer.py", line 1107, in _inlineCallbacks
result = g.send(result)
File "EpicGlinkTcpServer.py", line 887, in startFactory
yield rcs.delete(self.onlineDevices)
File "/usr/local/lib/python2.7/dist-packages/txredisapi-1.2-py2.7.egg/txredisapi.py", line 1698, in wrapper
d = self._factory.getConnection()
File "/usr/local/lib/python2.7/dist-packages/Twisted-15.0.0-py2.7-linux-i686.egg/twisted/internet/defer.py", line 1253, in unwindGenerator
return _inlineCallbacks(None, gen, Deferred())
--- <exception caught here> ---
File "/usr/local/lib/python2.7/dist-packages/Twisted-15.0.0-py2.7-linux-i686.egg/twisted/internet/defer.py", line 1107, in _inlineCallbacks
result = g.send(result)
File "/usr/local/lib/python2.7/dist-packages/txredisapi-1.2-py2.7.egg/txredisapi.py", line 2037, in getConnection
raise ConnectionError("Not connected")
txredisapi.ConnectionError: Not connected

如果我取消对 stopFactory() 的注释,则会抛出以下错误。

2018-09-02 16:11:24+0800 [BaseRedisProtocol,client] <twisted.internet.tcp.Connector instance at 0x9951e2c> will retry in 2 seconds
2018-09-02 16:11:24+0800 [BaseRedisProtocol,client] Stopping factory <txredisapi.RedisFactory instance at 0x9951dac>
2018-09-02 16:11:24+0800 [__main__.PlainTCPFactory] (TCP Port 6000 Closed)
2018-09-02 16:11:24+0800 [__main__.PlainTCPFactory] Stopping factory <__main__.PlainTCPFactory instance at 0x9962aac>
2018-09-02 16:11:24+0800 [__main__.PlainTCPFactory] afterRunning(): load from redis for logging
2018-09-02 16:11:24+0800 [__main__.PlainTCPFactory] Unhandled error in Deferred:
2018-09-02 16:11:24+0800 [__main__.PlainTCPFactory] Unhandled Error
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/Twisted-15.0.0-py2.7-linux-i686.egg/twisted/internet/defer.py", line 1107, in _inlineCallbacks
result = g.send(result)
File "EpicGlinkTcpServer.py", line 893, in stopFactory
yield rcs.delete(self.onlineDevices)
File "/usr/local/lib/python2.7/dist-packages/txredisapi-1.2-py2.7.egg/txredisapi.py", line 1698, in wrapper
d = self._factory.getConnection()
File "/usr/local/lib/python2.7/dist-packages/Twisted-15.0.0-py2.7-linux-i686.egg/twisted/internet/defer.py", line 1253, in unwindGenerator
return _inlineCallbacks(None, gen, Deferred())
--- <exception caught here> ---
File "/usr/local/lib/python2.7/dist-packages/Twisted-15.0.0-py2.7-linux-i686.egg/twisted/internet/defer.py", line 1107, in _inlineCallbacks
result = g.send(result)
File "/usr/local/lib/python2.7/dist-packages/txredisapi-1.2-py2.7.egg/txredisapi.py", line 2037, in getConnection
raise ConnectionError("Not connected")
txredisapi.ConnectionError: Not connected

我不知道如何在这里实现正确的代码。我还有两个选择。

  1. 添加另一个 synchrouns redis 库,不管当前的 txredisapi,在 main() 中添加两段代码。
  2. 在外部 bash shell 脚本中添加脚本。

但是,如果有人能帮我在工厂方法中实现。那将是完美的。

提前致谢。

最佳答案

查看下面的示例,我认为它可以帮助您。

redis.py

import txredis
from twisted.internet import protocol, reactor

REDIS = None
HOST = "localhost"
PORT = 6379

# Making connection ##############################################
def create_connection():
client_creator = protocol.ClientCreator(reactor, txredis.RedisClient)
df = client_creator.connectTCP(HOST, PORT)
df.addCallback(connection_success)
df.addErrback(cannot_connect)

# connection created
def connection_success(redis_protocol):
global REDIS
REDIS = redis_protocol

def cannot_connect(error):
print(error)


def getRedis():
global REDIS
return REDIS

create_connection()`

主.py

from twisted.internet.protocol import ServerFactory, Protocol
from twisted.internet import reactor

from redis import getRedis


class MyProtocol(Protocol):

def connectionMade(self):
print(self)


class MyFactory(ServerFactory):

protocol = MyProtocol
onlineDevices = 'GlinkOnlineDevices'

def __init__(self):
pass

def buildProtocol(self, addr):
print(getRedis())
p = self.protocol()
p.factory = self
return p

def startFactory(self):
def success(result):
print(result)

def gotError(error):
print(error)

redis = getRedis()
df = redis.delete(self.onlineDevices)
df.addCallback(success)
df.addErrback(gotError)

def stopFactory(self):
redis = getRedis()

def startService():
reactor.listenTCP(6000, MyFactory())

reactor.callLater(2, startService)
reactor.run()

这里我在2秒后启动了factory,在factory初始化之前建立redis连接。

为了方便起见,我建议不要在工厂中访问 Redis 对象,相反,您可以在 Redis 类中添加所需的方法,该方法在 Redis 数据库中执行操作。

希望对您有所帮助。

祝你好运。

关于redis - 我如何以扭曲的工厂方法访问redis?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52135171/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com