def __make_request(self, identifier, payload, response_id=None):
"""Directly makes a request and returns the response."""
# Acquire socket request lock
with self.lock:
# Cancel a (possibly) running keep-alive timer
self.keep_alive.cancel()
# Receive non-blocking, to clear the receive buffer
try:
self.sock.recv(1024, socket.MSG_DONTWAIT)
except socket.error as err:
if err.errno != 11:
raise err
else:
logger.info('Receive buffer was not empty before a request')
request = _construct_request(identifier, payload)
self.sock.send(request)
# Receive message, possibly retrying when wrong message arrived
while True:
data = self.sock.recv(1024)
response = _tear_down_response(data)
if not response_id or response_id == response[0]:
break
else:
logger.info('Received unexpected message, waiting for a '
'new one')
logger.debug('Request: %s', request)
logger.debug('Response: %s', response)
# Set keep-alive timer
self.keep_alive = threading.Timer(keep_alive_time, self.__keep_alive)
self.keep_alive.daemon = True
self.keep_alive.start()
return response
评论列表
文章目录