2017-04-20 4 views
1

내가 레디 스를 배우고 내가 파이프 라인의 개념을 차단하고 응답, 나는레디 스 파이프 라인 (200 개)의 지시 만 189

것은 내가 whitch에 연결 소켓을 사용하려면 어떻게 내 레디 스 서버에 명령을 보내려고하고있다 내가 사용하는 redis 서버.

여기 내 코드 (I 프랑스어입니다 그래서 일부 단어는 프랑스어에있을 것입니다)

def send(MESSAGE): 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.connect((TCP_IP, TCP_PORT)) 
    s.send(MESSAGE) 
    data = s.recv(BUFFER_SIZE) 
    s.close() 
    print "Envoi requete PC:", MESSAGE 
    return data 

입니다 그리고 여기가 파이프 라인을 사용하고있는 방법입니다

instruction ='SET compteur 0' 
donnee = instruction.encode('utf-8') + '\x0D\x0A' 
print envoie(donnee) 
instruction='' 
for i in range(200): 
    instruction = instruction + 'INCR compteur\r\n' 
donnee = instruction.encode('utf-8') + '\x0D\x0A' 
print send(donnee) 

나는 이렇게, 셸이 200 INCR compteur를 제공하지만 그 뒤에는 다음과 같이 표시됩니다 :

:1 
:2 
:3 
:4 
.... 
:185 
:186 
:187 
:188 
:189 

누군가 설명이 있습니까? 또한 예를 들어 GET compteur와 같은 다른 명령어를 사용하는 경우에는 147 + PONG 만 있습니다

+2

소켓을 손으로 정의하는 대신 파이썬에 redis 어댑터를 사용하지 않는 이유는 무엇입니까? 다른 사람들이 제안한 것처럼, 소켓에서 읽기를 처리하는 것은 그리 간단하지 않습니다. https : // github.com/andymccurdy/redis-py –

+0

redis adaptor를 사용할 수 없습니다.이 코드는 redis와 함께 제공되지 않는 PLC에 구현 될 것이므로, 파이썬 만 갖기 때문에 그렇게해야합니다. 그러나 감사합니다. 조언 –

답변

0

추가 할 수있는 두 개의 명령이 instraction를 둘러싸고 : MULTI 전 EXEC 당신의 지시 후. 이것은 원 자성을 보장하고 명령 실행의 모든 ​​결과를 얻습니다. transaction 설명서를 살펴보십시오.

pipelining도 읽어보십시오. 여기에 유용한 정보가 많이 있습니다.

실제로 내가 문제는 Redis가 답을 읽기 전에 답을 읽기 시작할 수 있다는 것입니다.

흐름의 논리 submitRequest -> receiveResults는 좋지만 Redis는 비동기 적으로 작업을 수행하므로 코드가 그렇게 작동하지 않습니다.

사실, 코드는 다음과 같은 방식으로 데이터를 읽습니다. 즉, 소켓에서 데이터를 읽습니다 (결과의 일부 | 아무것도 없습니까?). 문제는 Redis가 계산을 완료하는 것을 기다리지 않는다는 것입니다.

나는 파이썬에서는 좋지 않지만, data = s.recv(BUFFER_SIZE)은 'BUFFER_SIZE'바이트가있는 경우 s에서 읽을 것이라고 추측합니다. 그러나 결과의 일부만 소켓에 있으면이 명령은이 데이터 부분 만 리턴합니다. https://redis.io/clients#python

+0

답변을 주셔서 감사합니다. 버퍼가 너무 작다는 사실을 깨닫지 못했습니다. 버퍼를 너무 늘리면 완벽하게 작동합니다. 파이프 라이닝에 대해 읽고 있는데 코드가 크게 향상되었을 수 있습니다. –

0

Edgar가 제안했듯이파이썬 라이브러리를 사용하여 redis 연결을 쉽게 관리 할 수 ​​있습니다. 그 사용

예상대로

from redis import StrictRedis 

r = StrictRedis(host='localhost', db=1) 
pipe = r.pipeline() 

for i in xrange(100): 
    pipe.ping() 

results = pipe.execute() 

print len(results) 

제대로 100 PONGs (또는 True)을 나타낸다.

또는 INCR를 사용하여 유사한 시험 :

for j in xrange(100): 
    pipe.incr("test-incr", 1) 

results = pipe.execute() 

print len(results) 
print results[95:100] 

반환 :

100 
[96, 97, 98, 99, 100] 
+1

dizzyf 주셔서 감사합니다하지만이 방법을 사용할 수 없습니다,이 프로그램은 redis 장비되지 않습니다 로봇에 업로드됩니다, 내가 말했듯이 "이야기"작은 명령을 것입니다. 하지만 답변을 주셔서 감사합니다. 다른 프로그램을 사용하겠습니다. –