2017-02-22 127 views
3

我使用S3.Client.upload_fileobj()BytesIO流作爲輸入,以將文件從流上載到S3。我的功能不應該在上傳完成之前返回,所以我需要一種方法來等待它。Boto3:等待S3流式上傳完成

從文檔沒有明顯的方式來等待轉移完成,但有什麼可能工作的一些提示:

  1. 使用回調ARG等到進展在100%。在JavaScript中,使用回調或承諾是微不足道的,但在Python中我不太確定。
  2. 使用a S3.Waiter對象檢查對象是否存在。但它通過每5秒輪詢一次並且看起來非常無效。另外我不確定是否等到物體完成。
  3. 有一個類S3.MultipartUpload.complete()方法,但我懷疑這是否是我想要的。
  4. 做一個循環檢查對象是否完全上傳,如果沒有,睡一會兒。但是,如何檢查對象是否完整?

我一直在谷歌搜索,但似乎沒有人問同樣的問題。另外,大多數關於相關問題的結果都使用了不同的API(我相信upload_fileobj()是相當新的)。

編輯 如果發現了S3.Client.put_object這也接受一個類似文件的對象和塊,直到服務器響應。但是,這會與流結合使用嗎?我不確定Python多線程如何在這裏工作。該流最初來自S3.Client.download_fileobj(),通過subprocess.Popen()獲取管道,然後應該被上傳回S3。我可以看到,下載和子進程都以並行線程/進程運行。

回答

2

upload_file/upload_fileobj方法照顧你正在尋找的東西(即他們等待完成對象/文件上傳)。

我不建議第1或第4選項。無需使用s3服務器,因爲upload_file/upload_fileobj方法僅在上傳作業完成後才返回。

請注意,upload_file/upload_fileobj方法將自動處理讀取/寫入文件以及對大文件並行進行分段上傳,因此無需使用分段上傳而不考慮文件大小。

+1

謝謝,Venkatesh。所以,你的回答並沒有直接回答我的問題,但它仍然有幫助。從你的代碼判斷,我看到你認爲上傳在方法返回時完成。起初我對此有疑問,但後來檢查了源代碼。事實證明'upload_fileobj'實際上從傳輸管理器獲得'future',然後等待完成,所以你是對的!一旦該方法返回,上傳就完成了。這有助於很多!如果您可以編輯您的答案以更加簡潔和明確,我會接受它。謝謝! – cpury

+0

@cpury很高興知道我的答案以某種方式幫助了你!我很高興你發現/意識到我想表達的意思。我編輯了我的答案,以更簡潔明確。我希望你現在可以接受它。上議員:發佈現成的/示例代碼的唯一原因是「它會通過嘗試澄清對你的懷疑,你可以自己看到結果」,儘管發佈整個代碼是沒有必要的。 – Venkatesh