c# - 为什么任务并行性不会加快上传/下载速度?
问题描述
我编写了一个简单的 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());
我是否接近这个错误,导致不必要的瓶颈或什么?还是我从根本上误解了并行的好处?
解决方案
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-storage 下载所有 blob 后,您的代码将继续运行。由于我们没有单独等待每个下载任务,所有下载都同时运行。
推荐阅读
- java - 为什么重新安装 netbeans 后出现 JNI 错误?
- java - JAVA:如何在嵌套的 JSONString 中查找子字符串的所有匹配项并替换为一些文本
- javascript - window.open 不再适用于 Chrome/Edge 更新
- python - django中空条件的完整性错误
- arrays - macOS - 从 Raw Github + Parsing 获取 JSON 数据
- io - 使用相同的键写入现有的 Julia 数据文件
- database - 如何在 Flutter Floor 中实际查看数据库?
- python - 如何在 Pyspark 中过滤数据框
- python - 需要一个有效的算法来根据规格移动游戏块(游戏:Janggi)
- flutter - 颤振 2.0.1 发布失败