def get_batch(self,
                  ids: List[str],
                  schema: str,
                  fields: Optional[List[str]] = None,
                  concurrency: Optional[int] = None,
                  timeout: int = 60) -> GetBatchResponse:
        """
        Get a batch of documents by ID concurrently.

        Documents will be fetched with `concurrency` concurrent pooled connections.

        Missing (404) documents will be returned in the response. Any other non-200 responses will raise an exception.

        Args:
            ids: List of document IDs to get
            schema: Schema to get from
            fields: A optional list of fields to fetch from the document
            concurrency: Number of concurrent get requests
            timeout: Timeout in seconds per request

        Returns:
            List of GetDocumentResponse objects containing the documents fetched and any missing documents (404)
        """
        if not ids:
            return GetBatchResponse(responses=[], errors=False)

        if concurrency is None:
            concurrency = self.get_pool_size

        batch_response = conc.run_coroutine(
            self._get_batch_async(ids, fields, schema, concurrency, timeout)
        )

        return batch_response

        Get a batch of documents by ID concurrently.

        Documents will be fetched with `concurrency` concurrent pooled connections.

        Missing (404) documents will be returned in the response. Any other non-200 responses will raise an exception.

        Args:
            ids: List of document IDs to get
            schema: Schema to get from
            fields: A optional list of fields to fetch from the document
            concurrency: Number of concurrent get requests
            timeout: Timeout in seconds per request

        Returns:
            List of GetDocumentResponse objects containing the documents fetched and any missing documents (404)
        
src/marqo/vespa/vespa_client.py