Twisted Python을 사용하여 Redis 위에 키/값 데이터를 저장하는 서버를 구축하고 있습니다. 서버는 HTTP를 통해 JSON 사전을받습니다.이 사전은 파이썬 사전으로 변환되어 버퍼에 저장됩니다. 새로운 데이터가 저장 될 때마다 서버는 버퍼에서 한 사전을 팝하는 작업을 예약하고 txredis 클라이언트를 사용하여 모든 튜플을 Redis 인스턴스에 씁니다. 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)
는 기본적으로, 두 개의 서로 다른 연결 사이의 생산자/소비자 문제에 직면하고있다,하지만 난 현재 구현이 트위스트 paradygm에서 잘 작동하는지 모르겠습니다. Twisted에서 제작자/소비자 인터페이스에 대한 작은 설명서를 읽었지만 제 경우에는 사용할 수 있을지 잘 모르겠습니다. 비평가는 환영합니다. 나는 너무 오랜 세월의 스레드 동시성 (thread concurrency) 후에 이벤트 중심 프로그래밍에 대한 이해를 얻으려고합니다.