我想在多线程环境中使用 Google drive SDK。类线程Files.Insert
中的函数是否安全?DriveService
我在文档中找不到与此相关的任何内容。我什至找不到那里的单词线程。
有人知道 Google SDK 中的多线程是如何处理的吗?我需要DriveService
为每个线程创建单独的对象吗?
我想在多线程环境中使用 Google drive SDK。类线程Files.Insert
中的函数是否安全?DriveService
我在文档中找不到与此相关的任何内容。我什至找不到那里的单词线程。
有人知道 Google SDK 中的多线程是如何处理的吗?我需要DriveService
为每个线程创建单独的对象吗?
我一直在为我正在开发的使用它的 winforms 应用程序在 Google Drive SDK 上进行一些性能测试。我看到这篇文章并意识到我从未想过要检查这个问题,因为我一直认为 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 是线程安全的。但是,如果不是,则将其视为不是线程安全的似乎不会出现任何性能问题。
我希望这有帮助。