Я хочу выполнить многопоточность для загрузки объектов и получения вызываемого сообщения при использовании AWS S3 SDK для C ++.
Например: когда я загружаю 10 изображений в мое хранилище s3, другой поток увеличивает счетчик.Когда загрузка будет завершена, я должен получить вызываемый объект или указатель, который остановит приращение моего счетчика.
Мне нужна библиотека Thread Safe, чтобы я мог загружать / скачивать или обрабатывать файлы параллельно
PutObjectCallableRequest класс доступен, но типы параметров и определение не определены.Как мне выполнить эту задачу.Я не хочу использовать какие-либо API, необходимо использовать библиотеку s3 SDK.
Я приложил ссылку на пример кода загрузки объекта с помощью PutObjectRequest в aws s3 SDK для C ++.
https://github.com/awsdocs/aws-doc-sdk-examples/blob/master/cpp/example_code/s3/put_object.cpp
Предполагается, что это одна нить.Какую библиотеку мне следует использовать в случае, если я также хочу параллельно перечислять объекты моего сегмента?
Редактировать:
Это то, что я пытаюсь реализовать.Как внести изменения в следующий код, чтобы реализовать асинхронные операции и получить обратный вызов.
#include <aws/core/Aws.h>
#include <aws/core/client/ClientConfiguration.h>
#include <aws/core/http/Scheme.h>
#include <aws/core/utils/threading/Executor.h>
#include <aws/s3/S3Client.h>
#include <aws/transfer/TransferManager.h>
using namespace std;
using namespace Aws::S3;
using namespace Aws::S3::Model;
using namespace Aws::Client;
using namespace Aws::Http;
static const char* const ALLOCATION_TAG = "S3_MULTIPART_TEST";
int main(int /*argc*/, char** /*argv*/)
{
Aws::SDKOptions options;
Aws::InitAPI(options);
Aws::String bucket = "your-bucket-name";
// Set up S3 client
ClientConfiguration config;
config.region = "us-east-1";
config.connectTimeoutMs = 3000;
config.requestTimeoutMs = 60000;
auto s3Client = Aws::MakeShared<Aws::S3Client>(ALLOCATION_TAG, config, false);
// Aws::S3::S3Client s3Client(config);
auto sdk_client_executor = Aws::MakeShared<Aws::Utils::Threading::DefaultExecutor>(ALLOCATION_TAG);
Aws::Transfer::TransferManagerConfiguration transferConfig(sdk_client_executor.get());
transferConfig.s3Client = s3Client;
transferConfig.uploadProgressCallback =
[](const Aws::Transfer::TransferManager*, const std::shared_ptr<const Aws::Transfer::TransferHandle>&transferHandle)
{ std::cout << "Upload Progress: " << transferHandle->GetBytesTransferred() << " of " << transferHandle->GetBytesTotalSize() << " bytes\n"; };
static std::shared_ptr<Aws::Transfer::TransferManager> transferManager = Aws::Transfer::TransferManager::Create(transferConfig);
Aws::String fileToUpload = "MyFile.data";
std::shared_ptr<Aws::Transfer::TransferHandle> transferHandle = transferManager->UploadFile(fileToUpload.c_str(), bucket.c_str(), fileToUpload.c_str(),
"multipart/form-data", Aws::Map<Aws::String, Aws::String>());
size_t retries = 0;
transferHandle->WaitUntilFinished();
while (transferHandle->GetStatus() == Aws::Transfer::TransferStatus::FAILED && retries++ < 5)
{
transferManager->RetryUpload(fileToUpload.c_str(), transferHandle);
transferHandle->WaitUntilFinished();
}
transferHandle->SetIsMultipart(true);
Aws::Transfer::PartStateMap completedParts = transferHandle->GetCompletedParts();
string eTagList;
for (const auto &p : completedParts)
{
std::cout << "completedparts[" << p.first << "]" << p.second->GetETag() << '\n';
}
Aws::Transfer::TransferStatus status = transferHandle->GetStatus();
std::string res("Result:");
res.append(std::to_string((int)status));
std::cout << res.c_str() << std::endl;
Aws::ShutdownAPI(options);
return 0;
}
Этот код не работает.
error:no matching function for call to ‘Aws::S3::S3Client::S3Client(Aws::Client::ClientConfiguration&, bool)’
error in line: auto s3Client = Aws::MakeShared<Aws::S3Client>(ALLOCATION_TAG, config, false);