对redis-py源码进行分析, 实际redis建立TCP连接使用socket包进行的连接. 源码如下:
def connect(self):
if self._sock: # 如果连接已存在,则直接返回
return
try:
sock = self._connect()
except socket.timeout: # 此处即捕获socket的timeout异常
raise TimeoutError("Timeout connecting to server")
def _connect(self):
"Create a TCP socket connection"
"""此处即实际Redis使用socket进行tcp连接的方法,在此处会在连接超时时抛出异常"""
err = None
for res in socket.getaddrinfo(self.host, self.port, self.socket_type,
socket.SOCK_STREAM):
family, socktype, proto, canonname, socket_address = res
sock = None
try:
sock = socket.socket(family, socktype, proto)
# TCP_NODELAY
sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
# TCP_KEEPALIVE
if self.socket_keepalive:
sock.setsockopt(socket.SOL_SOCK