为什么任务并行处理不能加快上传/下载速度?

时间:2018-08-19 17:40:56

标签: c# azure async-await task-parallel-library azure-storage-blobs

我编写了一个简单的C#控制台应用程序,以测量顺序并并行下载20个Azure blob文件(每个图像约3mb)的速度。

我给人的印象是并行下载文件的速度会大大提高,但是根据我的经验,它实际上需要更长的时间。这是并行下载的代码:

    List<Task> tasks = new List<Task>();
    foreach (string blobName in blobNames)
    {
        Task t = Task.Run(() =>
        {
            CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName);
            blockBlob.DownloadToFileAsync(blobName, FileMode.Create).Wait();
        });

        tasks.Add(t);
    }

    Task.WaitAll(tasks.ToArray());

我是否正在处理此错误,导致不必要的瓶颈或其他原因?还是我从根本上误解了并行的好处?

2 个答案:

答案 0 :(得分:6)

IMO,您不应该为下载每个Blob启动新任务,因为这是I / O密集型操作,而不是计算密集型操作。 在实际上一无所获的情况下,使用多个任务会增加管理任务的开销。

将代码更改为:

List<Task> tasks = new List<Task>();
foreach (string blobName in blobNames)
{
    CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName);
    tasks.Add(blockBlob.DownloadToFileAsync(blobName, FileMode.Create));
}


Task.WaitAll(tasks.ToArray());

这将启动多个异步I / O请求,并且一旦从Azure Blob存储中下载了所有Blob,您的代码就会继续。 由于我们不分别等待每个下载任务,因此所有下载同时运行。

答案 1 :(得分:1)

  

我给人的印象是并行下载文件的速度会大大提高,但是根据我的经验,它实际上需要更长的时间。这是并行下载的代码:

IO操作的性能取决于很多因素。

只有在并非所有节点都已达到最大性能时,才可以使用并行化来加速。

例如,如果满足以下条件之一,则您将不会从中受益,并且由于开销,整体性能可能会降低:

专门用于下载:

  • 您正在达到网络,LAN或Internet,WAN的下载/上传容量
  • 您正在达到最大处理能力(磁盘,内存等)
  • 您正在达到远程服务器的最大上传容量(注意:可以绑定IP,尤其是对于云提供商)