Lidando com chamadas limitadas e conexões descartadas - Amazon Textract

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Lidando com chamadas limitadas e conexões descartadas

Uma operação do Amazon Textract pode falhar se você exceder o número máximo de transações por segundo (TPS), fazendo com que o serviço acelere seu aplicativo ou quando sua conexão cair. Por exemplo, se você fizer muitas chamadas para operações do Amazon Textract em um curto período de tempo, ele acelerará suas chamadas e enviará umProvisionedThroughputExceededExceptionerro na resposta da operação. Para obter informações sobre cotas do Amazon Textract TPS, consulteCotas do Amazon Textract.

Você pode gerenciar a limitação e as conexões descartadas ao tentar automaticamente a operação. Você pode especificar o número de novas tentativas, incluindo oConfigparâmetro quando você cria o cliente do Amazon Textract. Recomendamos uma contagem de novas tentativas de 5. OAWSO SDK executa uma operação pelo número especificado de novas tentativas para uma operação antes que ocorra falha e seja lançada uma exceção. Para obter mais informações, consulte Novas tentativas e recuo exponencial na AWS.

nota

As tentativas automáticas funcionam para operações síncronas e assíncronas. Antes de especificar novas tentativas automáticas, certifique-se de que você tenha a versão mais recente do AWS SDK. Para obter mais informações, consulte Etapa 2: Configurar aAWS CLIeAWSSDKs da.

O exemplo a seguir mostra como realizar novas tentativas de novas tentativas para as operações do Amazon Textract quando você estiver processando vários documentos.

Pré-requisitos
Para repetir operações automaticamente
  1. Carregue várias imagens de documento para o bucket do S3 para executar o exemplo síncrono. Carregue um documento de várias páginas para o bucket do S3 e executeStartDocumentTextDetectionnele para executar o exemplo assíncrono.

    Para obter instruções, consulteCarregar objetos no Amazon S3noGuia do usuário do Amazon Simple Storage Service.

  2. Os exemplos a seguir demonstram como usar oConfigparâmetro para tentar novamente uma operação automaticamente. O exemplo síncrono chama oDetectDocumentTextoperação, enquanto o exemplo assíncrono chama oGetDocumentTextDetectionoperação.

    Sync Example

    Use os exemplos a seguir para chamar oDetectDocumentTextoperação nos documentos no bucket do Amazon S3. Dentromain, altere o valor debucketno bucket do S3. Altere o valor dedocumentspara os nomes das imagens do documento que você carregou na etapa 2.

    import boto3 from botocore.client import Config # Documents def process_multiple_documents(bucket, documents): config = Config(retries = dict(max_attempts = 5)) # Amazon Textract client textract = boto3.client('textract', config=config) for documentName in documents: print("\nProcessing: {}\n==========================================".format(documentName)) # Call Amazon Textract response = textract.detect_document_text( Document={ 'S3Object': { 'Bucket': bucket, 'Name': documentName } }) # Print detected text for item in response["Blocks"]: if item["BlockType"] == "LINE": print ('\033[94m' + item["Text"] + '\033[0m') def main(): bucket = "" documents = ["document-image-1.png", "document-image-2.png", "document-image-3.png", "document-image-4.png", "document-image-5.png" ] process_multiple_documents(bucket, documents) if __name__ == "__main__": main()
    Async Example

    Use os exemplos a seguir para chamar a operação GetDocumentTextDetection. Ele pressupõe que você já ligouStartDocumentTextDetectionnos documentos no bucket do Amazon S3 e obteve umJobId. Dentromain, altere o valor debucketno bucket do S3 e o valor deroleArnpara o Arn atribuído à sua função Textract. Você também precisará alterar o valor dedocumentno nome do documento de várias páginas no bucket do Amazon S3. Finalmente, substitua o valor deregion_nameFornece o nome da sua região e forneça oGetResultsfunção com o nome do seujobId.

    import boto3 from botocore.client import Config class DocumentProcessor: jobId = '' region_name = '' roleArn = '' bucket = '' document = '' sqsQueueUrl = '' snsTopicArn = '' processType = '' def __init__(self, role, bucket, document, region): self.roleArn = role self.bucket = bucket self.document = document self.region_name = region self.config = Config(retries = dict(max_attempts = 5)) self.textract = boto3.client('textract', region_name=self.region_name, config=self.config) self.sqs = boto3.client('sqs') self.sns = boto3.client('sns') # Display information about a block def DisplayBlockInfo(self, block): print("Block Id: " + block['Id']) print("Type: " + block['BlockType']) if 'EntityTypes' in block: print('EntityTypes: {}'.format(block['EntityTypes'])) if 'Text' in block: print("Text: " + block['Text']) if block['BlockType'] != 'PAGE': print("Confidence: " + "{:.2f}".format(block['Confidence']) + "%") print('Page: {}'.format(block['Page'])) if block['BlockType'] == 'CELL': print('Cell Information') print('\tColumn: {} '.format(block['ColumnIndex'])) print('\tRow: {}'.format(block['RowIndex'])) print('\tColumn span: {} '.format(block['ColumnSpan'])) print('\tRow span: {}'.format(block['RowSpan'])) if 'Relationships' in block: print('\tRelationships: {}'.format(block['Relationships'])) print('Geometry') print('\tBounding Box: {}'.format(block['Geometry']['BoundingBox'])) print('\tPolygon: {}'.format(block['Geometry']['Polygon'])) if block['BlockType'] == 'SELECTION_ELEMENT': print(' Selection element detected: ', end='') if block['SelectionStatus'] == 'SELECTED': print('Selected') else: print('Not selected') def GetResults(self, jobId): maxResults = 1000 paginationToken = None finished = False while finished == False: response = None if paginationToken == None: response = self.textract.get_document_text_detection(JobId=jobId, MaxResults=maxResults) else: response = self.textract.get_document_text_detection(JobId=jobId, MaxResults=maxResults, NextToken=paginationToken) blocks = response['Blocks'] print('Detected Document Text') print('Pages: {}'.format(response['DocumentMetadata']['Pages'])) # Display block information for block in blocks: self.DisplayBlockInfo(block) print() print() if 'NextToken' in response: paginationToken = response['NextToken'] else: finished = True def main(): roleArn = 'role-arn' bucket = 'bucket-name' document = 'document-name' region_name = 'region-name' analyzer = DocumentProcessor(roleArn, bucket, document, region_name) analyzer.GetResults("job-id") if __name__ == "__main__": main()