Я создаю сервер, который хранит данные ключа / значения поверх Redis, используя Twisted Python.Сервер получает словарь JSON через HTTP, который преобразуется в словарь Python и помещается в буфер.Каждый раз, когда новые данные сохраняются, сервер планирует задачу, которая извлекает один словарь из буфера и записывает каждый кортеж в экземпляр Redis, используя клиент txredis.
class Datastore(Resource):
isLeaf = True
def __init__(self):
self.clientCreator = protocol.ClientCreator(reactor, Redis)
d = self.clientCreator.connectTCP(...)
d.addCallback(self.setRedis)
self.redis = None
self.buffer = deque()
def render_POST(self, request):
try:
task_id = request.requestHeaders.getRawHeaders('x-task-id')[0]
except IndexError:
request.setResponseCode(503)
return '<html><body>Error reading task_id</body></html>'
data = json.loads(request.content.read())
self.buffer.append((task_id, data))
reactor.callLater(0, self.write_on_redis)
return ' '
@defer.inlineCallbacks
def write_on_redis(self):
try:
task_id, dic = self.buffer.pop()
log.msg('Buffer: %s' % len(self.buffer))
except IndexError:
log.msg('buffer empty')
defer.returnValue(1)
m = yield self.redis.sismember('DONE', task_id)
# Simple check
if m == '1':
log.msg('%s already stored' % task_id)
else:
log.msg('%s unpacking' % task_id)
s = yield self.redis.sadd('DONE', task_id)
d = defer.Deferred()
for k, v in dic.iteritems():
k = k.encode()
d.addCallback(self.redis.push, k, v)
d.callback(None)
По сути, я сталкиваюсь с продюсером / потребителемпроблема между двумя разными соединениями, но я не уверен, что текущая реализация хорошо работает в парадигме Twisted.Я прочитал небольшую документацию по интерфейсам производитель / потребитель в Twisted, но я не уверен, что смогу использовать их в моем случае.Любые критики приветствуются: я пытаюсь понять программирование, управляемое событиями, после слишком многих лет параллелизма потоков.