我想在多線程環境中使用Google驅動器SDK。類函數Files.Insert
在DriveService
類中線程安全嗎?我在文檔中找不到與此相關的任何內容。我甚至找不到字線程那裏。Google Drive SDK線程安全
有人知道Google SDK如何處理多線程嗎?我是否需要爲每個線程創建單獨的DriveService
對象?
我想在多線程環境中使用Google驅動器SDK。類函數Files.Insert
在DriveService
類中線程安全嗎?我在文檔中找不到與此相關的任何內容。我甚至找不到字線程那裏。Google Drive SDK線程安全
有人知道Google SDK如何處理多線程嗎?我是否需要爲每個線程創建單獨的DriveService
對象?
我一直在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是線程安全的。但是,如果不是這樣,那麼在處理它時就不會出現任何性能問題,因爲它不是線程安全的。
我希望這會有所幫助。