code: def get_socket(self, all_credentials, checkout=False):
          
          # First get a socket, then attempt authentication. Simplifies
          # semaphore management in the face of network errors during auth.
          sock_info = self._get_socket_no_auth()
          try:
              sock_info.check_auth(all_credentials)
              yield sock_info
          except:
              # Exception in caller. Decrement semaphore.
              self.return_socket(sock_info)
              raise
          else:
              if not checkout:
                  self.return_socket(sock_info)
docs: Get a socket from the pool. Use with a "with" statement.
  
          Returns a :class:`SocketInfo` object wrapping a connected
          :class:`socket.socket`.
  
          This method should always be used in a with-statement::
  
              with pool.get_socket(credentials, checkout) as socket_info:
                  socket_info.send_message(msg)
                  data = socket_info.receive_message(op_code, request_id)
  
          The socket is logged in or out as needed to match ``all_credentials``
          using the correct authentication mechanism for the server's wire
          protocol version.
  
          Can raise ConnectionFailure or OperationFailure.
  
          :Parameters:
            - `all_credentials`: dict, maps auth source to MongoCredential.
            - `checkout` (optional): keep socket checked out.