2011-05-16 83 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