Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Redis流水线发送200条指令,只有189条答案_Python_Redis_Pipelining - Fatal编程技术网

Python Redis流水线发送200条指令,只有189条答案

Python Redis流水线发送200条指令,只有189条答案,python,redis,pipelining,Python,Redis,Pipelining,我正在学习Redis,我被流水线的概念所阻碍,我试图将指令发送到我的Redis服务器 为此,我使用一个套接字连接到我正在使用的redis服务器 这是我的密码(我是法国人,所以有些单词是法语) 下面是我使用管道的方式: instruction ='SET compteur 0' donnee = instruction.encode('utf-8') + '\x0D\x0A' print envoie(donnee) instruction='' for i in range(200):

我正在学习Redis,我被流水线的概念所阻碍,我试图将指令发送到我的Redis服务器

为此,我使用一个套接字连接到我正在使用的redis服务器

这是我的密码(我是法国人,所以有些单词是法语)

下面是我使用管道的方式:

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)
当我这样做时,shell会给我200 INCR computer,但后面是:

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

有人有解释吗?另外,如果我使用另一条指令,例如GET编译器,我只有147+PONG,正如Edgar建议的那样,请使用python库来帮助管理您的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个乒乓球(或
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]

正如Edgar所建议的,使用python库帮助管理您的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个乒乓球(或
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]

您可以在指令周围添加两个命令:指令前的MULTI和指令后的EXEC。这将保证原子性并获得执行命令的所有结果。看看文档

也请阅读有关。这里有很多有用的信息

事实上,我猜你们的问题是,你们可以在Redis返回答案之前开始阅读答案

虽然flow submitRequest->receiveResults的逻辑看起来不错,但您的代码不能以这种方式工作,因为Redis异步执行操作

事实上,您的代码以下一种方式读取:将数据(指令)发送到服务器->从套接字读取一些数据(结果|结果的一部分|什么都没有?)。问题是我们不需要等待Redis完成计算


我对Python不太在行,但我想如果存在
data=s.recv(BUFFER\u SIZE)
将从
s
读取多达“BUFFER\u SIZE”字节。但如果套接字中只存在部分结果,则此命令只返回这些部分数据。处理套接字的读取并不是像其他人建议的那样简单的操作-使用已经存在的库-

您可以在指令周围添加两个命令:MULTI-before和EXEC-before。这将保证原子性并获得执行命令的所有结果。看看文档

也请阅读有关。这里有很多有用的信息

事实上,我猜你们的问题是,你们可以在Redis返回答案之前开始阅读答案

虽然flow submitRequest->receiveResults的逻辑看起来不错,但您的代码不能以这种方式工作,因为Redis异步执行操作

事实上,您的代码以下一种方式读取:将数据(指令)发送到服务器->从套接字读取一些数据(结果|结果的一部分|什么都没有?)。问题是我们不需要等待Redis完成计算


我对Python不太在行,但我想如果存在
data=s.recv(BUFFER\u SIZE)
将从
s
读取多达“BUFFER\u SIZE”字节。但如果套接字中只存在部分结果,则此命令只返回这些部分数据。处理套接字的读取并不像其他人建议的那样简单——使用已经存在的库——

为什么不使用redis适配器代替手工定义套接字呢?我不能使用redis Adapter,因为这段代码将在PLC上实现,而PLC不提供redis,它只有python,所以我必须这样做,但是感谢您的建议,为什么不使用redis Adapter for python,而不是手动定义套接字呢?我不能使用redis Adapter,因为这段代码将在一个PLC上实现,该PLC不提供redis,它只有python,所以我必须这样做,但是谢谢你的建议谢谢你的回答,我没有意识到我的缓冲区这么小,我只是增加了它,它工作得很好。我现在正在阅读关于流水线的文章,这可能是对我的代码的一个很大的改进。谢谢你的回答,我没有意识到我的缓冲区太小了,我只是增加了它,它工作得很好。我现在正在阅读关于流水线的文章,这可能是对我代码的一个很大的改进。谢谢你,dizzyf,但我不能使用这种方法,这个程序将被上传到一个机器人上,这个机器人不会配备redis,它只会像我写的那样“讲”一些指令。但是谢谢你的回答,我会用一个不同的程序。谢谢你,dizzyf,但我不能用这个方法,这个程序将被上传到一个机器人上,这个机器人不会配备redis,它只会像我写的那样“说”一点指令。但是谢谢你的回答,我会用另一个程序。