我使用S3.Client.upload_fileobj()
和BytesIO
流作爲輸入,以將文件從流上載到S3。我的功能不應該在上傳完成之前返回,所以我需要一種方法來等待它。Boto3:等待S3流式上傳完成
從文檔沒有明顯的方式來等待轉移完成,但有什麼可能工作的一些提示:
- 使用回調ARG等到進展在100%。在JavaScript中,使用回調或承諾是微不足道的,但在Python中我不太確定。
- 使用a
S3.Waiter
對象檢查對象是否存在。但它通過每5秒輪詢一次並且看起來非常無效。另外我不確定是否等到物體完成。 - 有一個類
S3.MultipartUpload
與.complete()
方法,但我懷疑這是否是我想要的。 - 做一個循環檢查對象是否完全上傳,如果沒有,睡一會兒。但是,如何檢查對象是否完整?
我一直在谷歌搜索,但似乎沒有人問同樣的問題。另外,大多數關於相關問題的結果都使用了不同的API(我相信upload_fileobj()
是相當新的)。
編輯 如果發現了S3.Client.put_object
這也接受一個類似文件的對象和塊,直到服務器響應。但是,這會與流結合使用嗎?我不確定Python多線程如何在這裏工作。該流最初來自S3.Client.download_fileobj()
,通過subprocess.Popen()
獲取管道,然後應該被上傳回S3。我可以看到,下載和子進程都以並行線程/進程運行。
謝謝,Venkatesh。所以,你的回答並沒有直接回答我的問題,但它仍然有幫助。從你的代碼判斷,我看到你認爲上傳在方法返回時完成。起初我對此有疑問,但後來檢查了源代碼。事實證明'upload_fileobj'實際上從傳輸管理器獲得'future',然後等待完成,所以你是對的!一旦該方法返回,上傳就完成了。這有助於很多!如果您可以編輯您的答案以更加簡潔和明確,我會接受它。謝謝! – cpury
@cpury很高興知道我的答案以某種方式幫助了你!我很高興你發現/意識到我想表達的意思。我編輯了我的答案,以更簡潔明確。我希望你現在可以接受它。上議員:發佈現成的/示例代碼的唯一原因是「它會通過嘗試澄清對你的懷疑,你可以自己看到結果」,儘管發佈整個代碼是沒有必要的。 – Venkatesh