2016-06-02 7 views
4

Ist boto3.Bucket.upload_file blockierend oder nicht blockierend?Wird boto3.Bucket.upload_file blockiert oder nicht blockiert?

das heißt, wenn ich die folgende

bucket = session.Bucket(bucket_name) 
bucket.upload_file(Key=s3_key, Filename=source_path) 
os.remove(source_path) 

Muss ich eine Race-Bedingung laufen, von der Größe der Datei abhängig? Oder wird der Upload vor dem Löschen der Datei garantiert abgeschlossen?

+0

bessere Formulierung: "synchron oder asynchron" – tedder42

Antwort

1

Der aktuelle boto3 upload_file blockiert. Wie mootmoot sagte, sollten Sie definitiv eine Fehlerbehandlung implementieren, um sicher zu sein, wenn Sie die Datei löschen.

+3

Warum ist das der folgenden Antwort völlig entgegengesetzt? Können wir schlüssige Beweise bekommen? – retrocookie

1

Die Tatsache upload_file() verwendet S3Transfer zeigt an, dass der Anruf nicht blockierend ist. Sie müssen den Fortschritt verfolgen (S3Transfer-APIs) und die Datei löschen, nachdem Sie sichergestellt haben, dass die Übertragung abgeschlossen ist.

+0

Sind Sie sicher? Basierend auf einigen schnellen und schmutzigen Experimenten sieht es so aus, als ob der Anruf relativ zum Callback blockiert. Für die von mir getesteten Dateien wurde der Rückruf immer mit dem Argument 0 aufgerufen, bevor der Anruf entsperrt wurde. Ich bin mir nicht sicher, ob dies ein konsistentes Verhalten ist ... – BlackSheep

+0

@BlackSheep: Das ist Quelltext https://github.com/boto/boto3/blob/develop/boto3/s3/transfer.py Aber es ist dein eigene Aufgabe, um das Zeitlimit für Upload-Verbindungen, ungültige Anmeldeinformationen usw. zu überprüfen, um zu vermeiden, dass die Datei gelöscht wird, wenn der Upload fehlgeschlagen ist. – mootmoot

0

Ob Blockieren oder Entsperren, Sie sollten sich NICHT auf die API allein verlassen, wenn es schlecht lief. Sie MÜSSEN die Ausnahmebehandlung hinzufügen, wenn der Upload aus irgendeinem Grund in der Mitte fehlschlägt (z. B. wenn der Administrator den Router neu startet, wenn Sie den Upload durchführen).

bucket = session.Bucket(bucket_name) 
try : 
    bucket.upload_file(Key=s3_key, Filename=source_path) 
    os.remove(source_path) 
except : 
    raise 

Eine weitere gute Praxis Datei S3 laden zusätzliche Metadaten hinzugefügt.

bucket.upload_file(
    Key=s3_key, 
    Filename=source_path, 
    extra_args={'Metadata': {'source_path': source_path}} 
) 

Ereignis S3 Bucket Hinzufügen auf Erfolg PUT Aktion zu handeln auch Sie Bereinigungsprozess erstellen, wenn es Erfolg Upload ist aber Fehler auf lokale Dateientfernung. (Man stelle sich die Datei gesperrt ist oder die Datei angegeben ist Read-only Zugriff).