0

我想在多线程环境中使用 Google drive SDK。类线程Files.Insert中的函数是否安全?DriveService我在文档中找不到与此相关的任何内容。我什至找不到那里的单词线程

有人知道 Google SDK 中的多线程是如何处理的吗?我需要DriveService为每个线程创建单独的对象吗?

4

1 回答 1

0

我一直在为我正在开发的使用它的 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 是线程安全的。但是,如果不是,则将其视为不是线程安全的似乎不会出现任何性能问题。

我希望这有帮助。

于 2013-04-19T22:32:44.287 回答