14

在下面的代码中,管道超时是 2 秒吗?

client = redis.StrictRedis(host=host, port=port, db=0, socket_timeout=2)
pipe = client.pipeline(transaction=False)
for name in namelist:
    key = "%s-%s-%s-%s" % (key_sub1, key_sub2, name, key_sub3)
    pipe.smembers(key)
pipe.execute()

在redis中,集合“key”中有很多成员。它总是返回错误,如下所示,代码最后:

error Error while reading from socket: ('timed out',)

如果我将 socket_timeout 值修改为 10,它会返回 ok。
参数“socket_timeout”不是表示连接超时吗?但它看起来像响应超时。
redis-py 版本是 2.6.7。

4

2 回答 2

27

我在github上问了redis-py的作者andymccurdy ,得到的答案如下:

如果您使用的是 redis-py<=2.9.1,socket_timeout 既是套接字连接的超时时间,也是读取/写入套接字的超时时间。我最近推送了一个更改 (465e74d),它引入了一个新选项 socket_connect_timeout。这允许您为 socket.connect() 指定与 socket.send/socket.recv() 不同的超时值。此更改将包含在定于本周晚些时候发布的 2.10 中。

redis-py版本是2.6.7,所以既是socket连接超时,也是socket读/写超时。

于 2014-05-30T23:36:41.597 回答
2

不是连接超时,是操作超时。在内部 StrictRedis() 上的 socket_timeout 参数将被传递给套接字的 settimeout 方法。

有关详细信息,请参见此处:https ://docs.python.org/2/library/socket.html#socket.socket.settimeout

于 2014-05-29T18:22:06.120 回答