gpt4 book ai didi

Azure 存储 Blob 类型(CloudBlobContainer、CloudBlobClient 等)和线程安全

转载 作者:行者123 更新时间:2023-12-04 11:43:29 26 4
gpt4 key购买 nike

我正在开发一个 azure 的应用程序,它需要在某个时候上传(下载)大量的小 blob 到单个容器(超过 1k blob,每个小于 1 Mb)。为了加快这个过程,我想使用多个线程来上传(下载)blob。

这是我用于上传单个 blob 的例程:

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConnectionString);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer blobContainer =
blobClient.GetContainerReference(ContainerName);
blobContainer.CreateIfNotExist();

CloudBlob blob = blobContainer.GetBlobReference(Id);
blob.UploadByteArray(Data);

对于上面代码中使用的每种类型,MSDN 的说明如下:

Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.

这是否意味着我需要在每个线程中执行以下代码?或者也许我只能执行一次并在不同线程之间共享 CloudBlobContainer 的单个实例?

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConnectionString);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer blobContainer =
blobClient.GetContainerReference(ContainerName);

我真的很高兴在不同的线程中使用 CloudBlobContainer 的单个实例,否则它会严重减慢整个上传(下载)过程。

最佳答案

只要您不尝试对容器本身执行更新,您应该可以共享单个 blob 容器引用(即使如此,我认为在大多数情况下(例如 List)它仍然没问题)。事实上,如果您确定容器引用存在,您甚至不需要它:

client.GetContainerReference("foo").GetBlobReference("bar");
client.GetBlobReference("foo/bar"); //same

如您所见,获取容器引用的唯一原因是您想对容器本身执行操作(列表、删除等)。如果将 blob 引用保留在单独的线程中,那就没问题了。

关于Azure 存储 Blob 类型(CloudBlobContainer、CloudBlobClient 等)和线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6915424/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com