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

2023-11-26

我正在开发一个 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 的说明如下:

此类型的任何公共静态(在 Visual Basic 中为共享)成员都是 线程安全。不保证任何实例成员都是线程 安全的。

这是否意味着我需要在每个线程中执行以下代码?或者也许我只能执行一次并在不同线程之间共享 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 引用保留在单独的线程中,那就没问题了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Azure 存储 Blob 类型(CloudBlobContainer、CloudBlobClient 等)和线程安全 的相关文章

随机推荐

  • Python:使用 mysqldb 将 MySQL 表作为字典导入?

    有人知道如何使用 mysqldb 将包含大量行的 MySQL 表转换为 Python 中的字典对象列表吗 我的意思是 将一组包含 a b 和 c 列的 MySQL 行转换为如下所示的 Python 对象 data a A b 2 4 c 3
  • 在 JBoss 中部署的 java servlet 中加载属性文件作为 war

    我在 JBoss 4 0 2 中部署了一个 servlet 作为 war 我有一个已部署应用程序的属性文件 我应该把这个文件放在哪里 jboss server default conf文件夹下的conf目录下 如何以可移植的方式加载该属性文
  • 如何在 Handlebars 中引用当前迭代的对象

    有没有办法获取Handlebars中当前迭代的对象 code 我已经提到过processObject 这是不正确的 这就是我需要更换 解决方案的地方 希望你明白我想说的 的内容objArr可能看起来像 var objArr objField
  • android 获取视频缩略图路径,而不是位图

    是否可以获取视频缩略图 PATH 而不是 Bitmap 对象本身 我知道方法 MediaStore Images Thumbnails queryMiniThumbnail 但由于我使用自己的位图缓存机制 我希望拥有视频缩略图的路径而不是位
  • 在 grails 中插入的 SQL 查询

    如何在 grails 中执行纯 sql 我需要使用 sql 查询在数据库中插入新记录 我们如何在不使用 HQL 和 gorm 关系的情况下实现这一目标 thanks groovy sql Sql 简化了执行 JDBC 查询的细节 在 Gra
  • UIPanGestureRecognizer 有时无法在 iOS 7 上运行

    我收到 iOS 7 用户的间歇性报告称UIPanGestureRecognizer每隔一段时间就会停止处理某些视图 他们应该能够向右 向左滑动视图 但它只是中断并且由于某种未知原因而无法工作 强制退出应用程序并重新启动即可解决问题 这个问题
  • 如何在play框架项目中使用相对路径访问资源文件?

    我的 play 框架项目使用资源文件 例如我在资源目录下创建的 CSV 文件 这些文件是我直接在 play 项目根目录下创建的 因此它与其他目录 如 app public 等 处于同一级别 从 Java 或 Scala 文件中如何打开此类文
  • find 和Where 与关系之间的区别

    我不认为在活动记录和查找数据方面有什么区别 这是我的模型 class User lt ActiveRecord Base has many shows end class Show lt ActiveRecord Base belongs
  • 如何从主方法调用非静态方法? [复制]

    这个问题在这里已经有答案了 例如 我正在尝试做这样的事情 public class Test public static void main String args int arr new int 5 arrPrint arr public
  • 为什么 array.reduce() 从索引 1 开始

    我想知道为什么索引在array reduce 在下面的示例中从 1 而不是 0 开始 11 22 33 44 reduce acc val index gt console log val This outputs 22 33 and 44
  • JavaScript 迭代器

    我在浏览 MDN Mozilla 开发者网络 时遇到了迭代器和生成器 很自然地 我尝试了 Google Chrome v21 页面中给出的代码片段 具体来说 这段代码 var it Iterator lang for var pair in
  • Firebase 使用安全规则删除子项!写入时存在 data.exists

    我有一个用于添加新数据的安全规则 CATEGORIES CATEGORIES write root child USERS auth uid type val admin data exists root child USERS auth
  • Android:SingleClientConnManager 的使用无效:连接仍分配[重复]

    这个问题在这里已经有答案了 可能的重复 使用 HttpRequest execute 时出现异常 SingleClientConnManager 的使用无效 连接仍分配 我在 Android 上工作 我创建了 Http Singleton
  • 使用 SSE 进行高效 4x4 矩阵向量乘法:水平加法和点积 - 有什么意义?

    我正在尝试使用 SSE 找到 4x4 矩阵 M 与向量 u 乘法的最有效实现 我的意思是 Mu v 据我了解 有两种主要方法可以解决此问题 method 1 v1 dot row1 u v2 dot row2 u v3 dot row3 u
  • 如何将java.util.logging发送到log4j?

    我有一个现有的应用程序 它根据 log4j 进行所有日志记录 我们使用许多其他库 它们要么也使用 log4j 要么根据 Commons Logging 进行日志记录 最终在我们的环境中在幕后使用 log4j 我们的依赖项之一甚至针对 slf
  • SQL where in 子句使用 pandas 数据框中的列

    我有一个 pandas 数据框 其中有一列 ID 我需要运行另一个 sql 查询 其 WHERE 子句由上述列中的所有 ID 指定 Ex df1 DataFrame IDs 1 2 3 4 5 6 query Select id SUM r
  • Google PubSub 和来自 TOPIC 的重复消息

    如何防止 Google Cloud PubSub 中发生重复消息 比如说 我有一个处理它所订阅的消息的代码 假设我有 2 个节点 它们的服务具有相同的代码 一旦一个节点收到消息但尚未确认 另一个节点将收到相同的消息 这就是问题所在 我们有两
  • 如何取消 Android Edittext 中选定文本的粗体?

    我正在使用编辑文本来支持粗体 斜体和下划线的属性 选择文本并将其设置为粗体后我成功了 现在我想在单击 正常 按钮后删除粗体 字体 NORMAL不在这里工作 任何人都可以建议其他选择吗 Button btnBold Button findVi
  • 从 qt Creator 中删除项目

    如何从 qt Creator 中删除项目 我可以从项目视图中删除文件 但无法删除 pro 文件和主项目文件夹 这有点肮脏 但是 在窗户上 进入AppData Roaming QtCreator ini文件并在 ProjectExplorer
  • Azure 存储 Blob 类型(CloudBlobContainer、CloudBlobClient 等)和线程安全

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