2013-03-15 114 views
0

我想在多線程環境中使用Google驅動器SDK。類函數Files.InsertDriveService類中線程安全嗎?我在文檔中找不到與此相關的任何內容。我甚至找不到字線程那裏。Google Drive SDK線程安全

有人知道Google SDK如何處理多線程嗎?我是否需要爲每個線程創建單獨的DriveService對象?

回答

0

我一直在Google Drive SDK上爲我正在使用的winforms應用程序進行一些性能測試。我看到這篇文章,並意識到我從來沒有想過要檢查這個問題,因爲我一直認爲API是線程安全的。所以我跑了一些測試。我已經在一個文件重命名方法做了一些性能測試如下:

public static bool SetFileName(string gFileID, string filename, int attempt) 
    { 
     File sourcefile; 
     File replacement = new File(); 
     bool save = false; 
     replacement.Title = filename; 
     replacement.Description = filename; 
     try 
     { 
      FilesResource.PatchRequest request = DriveService.Files.Patch(replacement, gFileID); 
      sourcefile = request.Fetch(); 
     } 
     catch (Exception e) 
     { 
      if (attempt < 10) 
      { 
       return SetFileName(gFileID, filename, attempt + 1); 
      } 
      throw e; 
     } 
     bool result = sourcefile.Title == replacement.Title & sourcefile.Description == replacement.Description; 
     if(!result && attempt<10) 
      return SetFileName(gFileID, filename, attempt + 1); 
     return result; 
    } 

我跑連續的測試得到的錯誤率和執行時間的這種方法。當我閱讀你的文章時,我決定在後臺工作人員上運行測試,以瞭解該方法在多線程環境中的工作方式。在上面的例子中,DriveService對象實例化如下:

private static DriveService DriveService 
    { 
     get 
     { 
      if (_service == null) 
      { 
       try 
       { 
        _service = new DriveService(Auth); 
       } 
       catch (Exception) 
       { 
       } 
      } 
      return _service; 
     } 
    } 

正如你看到的,我的DriveService對象實例化一次,使之與多個背景工人同時運行時,所有的人都用的同一個實例DriveService。我用1000個併發線程運行測試,儘管它確實產生了一些錯誤,但這些錯誤都是從谷歌驅動器服務器返回的「(500)內部服務器錯誤」。似乎所有的文件名都被正確設置,並且所有的線程都沒有掛起來完成。

但是,在單獨的性能測試中,我試圖確定在每次需要時實例化DriveService時是否存在重大的性能問題。所以,我修改了代碼如下:

private static DriveService DriveService 
    { 
     get 
     { 
      return new DriveService(Auth); 
     } 
    } 

而且我又跑了一些性能測試,這次想看看是否有在時間顯著差異花跑一個單DriveService實例之間的100個併發線程和爲每個線程創建一個新的驅動器實例。我沒有看到任何顯着的表現差異。儘管運行之間存在差異,但在我看來,這些差異與運行PatchRequest的服務器端處理時間有關,與您是否在需要時創建DriveService的新實例幾乎沒有任何關係。

我知道這不是確定性的,但它在我看來像Google Drive SDK是線程安全的。但是,如果不是這樣,那麼在處理它時就不會出現任何性能問題,因爲它不是線程安全的。

我希望這會有所幫助。