2011-05-16 135 views
5

我需要一些帮助来了解Azure CloudBlobClient,CloudQueueClient和CloudBlob类中的线程安全性。Azure Blob和队列线程安全

我正在开发一个包含多个独立作业处理器的工作者角色,其中每个作业处理器都从特定的队列中读取数据,并向某些可能相同的blob容器进行写入/更新。

我想确保这些作业处理器不会踩在彼此的脚趾上。

1>如何确保没有使用任何类型的锁就是这种情况?如果我将一个单独的CloudBlobClient和CloudQueueClient分配给每个作业处理器(都位于同一进程中),是否足以说它们彼此独立,并且因为每个作业处理器都使用单独的客户端实例,所以它们将不会运行相互依赖?如果我尝试在使用Parallel.ForEach的CloudBlobClient上并行执行并行调用GetBlobReference或UploadText,是否需要合并某种同步或者这些方法是否线程安全? Azure文档说,他们不是但我在网上看到的大多数例子似乎都没有对这些方法应用任何类型的同步机制。达到此目的的最佳方法是什么?我的意思是使用一个CloudBlobClient并行调用GetBlobReference或UploadText的最佳方式?

回答

2

我在CloudBlobClientdocumentation on MSDN一看,什么它说的是:

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

由于这不是一个静态成员,因此不保证是线程安全的。如果你想确保你不会被任何线程问题困扰,MS可能在存储客户端库中错过了,那么是的,你应该确保每个线程都有自己的客户端(可能会创建一个ThreadStatic变量) 。

话虽如此,我已使用CloudBlobClientParallel.ForEach上传多个项目,而不会导致任何问题。

+0

但我有点同意奥利弗,因为这是更多的锅炉评论。我找不到任何报告的问题,除非您使用的ParallelOperationThreadCount高于1。如果我不需要,我宁愿不锁定代码。 – iCode 2011-05-17 02:22:38

+0

您几乎在框架中的每个类都会看到关于线程安全性的评论。库使用ParallelOperationThreadCount在内部创建线程,所以这不应该影响你在做什么。客户端类创建相当轻量级。 – knightpfhor 2011-05-17 03:16:51

0

randomly chosen function的文档中提到“任何公共静态...成员都是线程安全的,任何实例成员都不能保证线程安全。”但是我会认为这是插入样板的原因,因为有人可以不用费心考虑它。我建议你使用Reflector来检查这些类,但是我希望它们可以正常工作,因为所有引用的类都只是属性的存储库,当你进行诸如UploadText之类的调用时,这些属性最终会被放入HTTP REST请求中。只要你不改变一个对象在不同线程中的属性(我认为你不需要为你的Parrallel.ForEach的每次迭代创建一个CloudBlobReference),那么我认为你将是安全的。

+0

我同意你的看法,因为这可能更像是一般性陈述。我的反射器不再工作,它要求我的信用卡号码!这就是为什么我无法检查它。希望Azure团队的成员能够澄清这一点。 – iCode 2011-05-17 02:25:04

+0

红门现在可以免费提供更旧版本的Reflector。可能他们不容易找到。 – 2011-05-17 05:05:39