我想在多线程环境中使用 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 是线程安全的。但是,如果不是,则将其视为不是线程安全的似乎不会出现任何性能问题。
我希望这有帮助。