Azure Functions中Task.Run本地并行、部署后串行问题咨询
Azure Functions 任务并行执行问题排查与解决
问题场景
本地运行时任务可正常并行执行,但部署到采用S1计划的Azure Functions后,任务变为串行执行。原实现代码如下:
var allRecordTasks = new List<Task<DataRecord>>(); for (int i = 0; i < 100; i++) { allRecordTasks.Add(Task.Run(() => MyTask(cancellationToken))); } await Task.WhenAll(allRecordTasks);
其中MyTask的实现为:
private async Task<DataRecord> MyTask(CancellationToken cancellationToken) { var timeSeriesType = await GetTimeSeriesTypeAsync(); var dataRecord = new DataRecord(timeSeriesType); return dataRecord; }
相关疑问:
- 原本认为单核的S1计划支持多线程,是否有配置项可解决串行问题?
- 多核心的Azure Functions计划是否原生支持任务并行?
- 是否必须依赖Durable Functions才能实现并行执行?
解决方案
将代码修改为直接添加异步任务实例,即可在Azure Functions中实现并行执行:
allRecordTasks.Add(MyTask(cancellationToken));
问题根源
原代码中使用Task.Run额外开启线程,结合其他未提及的代码逻辑导致CPU核心占用过高。本地四核环境资源充足,该问题影响不明显;但在单核的S1计划环境中,过高的CPU占用会阻塞任务调度,最终表现为任务串行执行。
内容的提问来源于stack exchange,提问作者Norbert Huurnink
相关产品推荐
相关产品推荐

