Je suis en train de construire un serveur qui stocke les données clé/valeur sur Redis en utilisant Twisted Python. Le serveur reçoit un dictionnaire JSON via HTTP, qui est converti en dictionnaire Python et placé dans un tampon. Chaque fois que de nouvelles données sont stockées, le serveur planifie une tâche qui extrait un dictionnaire du tampon et écrit chaque tuple dans une instance Redis, en utilisant un client txredis.Encore un autre problème producteur/consommateur dans Twisted Python
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)
Fondamentalement, je suis face à un problème producteur/consommateur entre deux connexions différentes, mais je ne suis pas sûr que la mise en œuvre actuelle fonctionne bien dans le Twisted paradygm. J'ai lu la petite documentation sur les interfaces producteur/consommateur dans Twisted, mais je ne suis pas sûr de pouvoir les utiliser dans mon cas. Les critiques sont les bienvenues: j'essaie de comprendre la programmation événementielle, après tant d'années de concurrence entre les threads.