繁体   English   中英

Task.Run in C# Azure 函数

[英]Task.Run in C# Azure Functions

我正在使用以下逻辑,在本地运行时似乎是并行运行的,但是当部署在 azure 函数上时,它是按顺序运行的:

var allRecordTasks = new List<Task<DataRecord>>();
for (int i = 0; i < 100; i++)
{
    allRecordTasks.Add(Task.Run(() => MyTask(cancellationToken)));
}

await Task.WhenAll(allRecordTasks);

我在 S1 计划下运行,并且假设单个内核可以运行多个线程。

是否有一些设置可以使这项工作,在运行具有多个核心的计划时是否可能,或者如果不使用持久功能就不可能吗?

private async Task<DataRecord> MyTask(CancellationToken cancellationToken)
        {
            var timeSeriesType = await GetTimeSeriesTypeAsync();
            var dataRecord = new DataRecord(timeSeriesType);
            return dataRecord;
        }

更新:简单地使用

allRecordTasks.Add(MyTask(cancellationToken));

并行运行。 我的代码中的其他问题导致 CPU 内核繁忙,这在本地(四核)上花费不多,但会影响单核的性能。 感谢 Peter Bons 和 Stephen Cleary 解决了问题,为我指明了正确的方向。

我在 S1 计划下运行,并且假设单个内核可以运行多个线程。

好吧,有点。 任何核心都可以“运行”任意数量的线程。 但是当然每个核心只是一个核心,一次只执行一条CPU指令。 因此,如果您谈论的是执行 CPU 工作的线程,那么它一次只能是一个。

(最有可能的是,CPU 实际上是周期性地在任务之间切换,但总体时间基本上与它只是按顺序运行它们一样)。

是否有一些设置可以使这项工作,在运行具有多个核心的计划时是否可能,或者如果不使用持久功能就不可能吗?

它应该与多个内核很好地并行化。

专业提示:您可以使用Process Explorer在本地运行的实例上设置 Processor Affinity 以模拟一个(或两个,或...)内核。

async await 与 multithreading 不同 它们有些关系,但是把东西放在任务中绝不构成多线程。

请改用Parallel Tasks ,例如参见与您的问题类似的问题的第二个答案

特别是对于 Azure 函数,我不会像这样实现并行性,因为生态系统提供了通过使用queues来实现的正确方法。 因此,您有一个 function 和当前触发器,用于检索 DataRecords 列表,然后将每个触发器放在队列中,然后是第二个 function,它带有处理队列中项目的 QueueTrigger。 只要应用程序服务计划允许,第二个 Function 就会并行执行多次。 请注意,我不是在谈论 2 个独立的 function 应用程序,而是 2 个具有不同触发器的方法。

使用自定义多线程或并行性还可能导致动态托管计划 (Y1) 出现问题,其中 function 的执行可能会在 function 返回结果后立即停止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM