c# - 同一线程可以在 Azure Functions 中同时运行多个函数吗?

标签 c# azure asp.net-core azure-functions

我的所有函数都是静态方法。它们看起来像下面的示例,带有一个静态类和一个静态方法来处理该函数。

public static class Function1
{
    [FunctionName("Function1")]
    public static async Task<IActionResult> Run(
        [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
        ILogger log)
    {
        log.LogInformation("C# HTTP trigger function processed a request.");

        await Task.CompletedTask;

        return new OkObjectResult("message");
    }
}

对于每个函数调用,我都会根据请求参数设置Thread.CurrentThread.CurrentUICulture。这有助于我根据用户设备的文化返回本地化文本。 (我正在使用 .resx 文件)

我的问题是,在高度并发的环境中,用户是否有可能收到本地化为另一种文化的文本?如果同一个线程同时处理多个函数,那么我相信这个问题是可能的。我试图了解 Azure Functions 是否为每个线程分配一个函数调用。

最佳答案

I'm trying to understand if Azure Functions allocates one function call per thread or not

我认为您想要回答的重要问题是“是否为单个函数调用的整个生命周期分配了相同的线程”。答案是:这取决于,就你的情况而言,我认为这与否一样好。

在非异步世界中,应用程序从上到下流动,因此线程没有机会更改。因此,如果您从不使用 await 关键字,您就可以非常确定您的函数将在单个线程上运行。

仅使用 await 关键字并不能保证它会更改线程。如果调用 awaitasync 操作已经完成,它将继续同步。这方面的一个例子是在您执行的示例代码中

await Task.CompletedTask;

因为 Task.CompleteTask 已经完成,所以您不会在那里进行任何线程交换。

除此之外,在正确的异步调用上调用 await 并不能保证线程在完成时会发生变化。当您在适当的异步调用上调用 await 时,它会将线程释放回线程池,以便它可以执行其他操作。当异步调用返回时,可能会发生两种不同的事情。

如果存在 SyncronizationContext(Azure Functions 中默认没有),它将使用它在同一线程上继续执行该函数。

如果没有,则使用线程池中的随机线程来继续请求。它有可能选择启动它的同一个线程,但这不太可能。

所以基本上在您的情况下,如果您实际上在 azure 函数中进行异步调用,则不能依赖在整个函数调用中使用相同的线程。

你应该做什么

您说您正在使用 Resx 文件进行本地化,虽然我从来没有这样做过,但这似乎是一个很好的方法。我假设您的解决方案基于某些东西 like this post .

虽然您可以像这样管理线程,但我认为如果您的 Azure Function 应用程序中有多个 Azure Functions,则可能会导致意外问题。相反,我建议离开Microsoft's recommended localization practices并使用 ResourceManager在不改变线程文化的情况下获取本地化资源。

*有关 Azure Functions 的额外说明

在该帖子的评论中,Rex 表示 Azure Functions 彼此独立运行。他们每个人都在自己的小沙箱中运行。这是事实,但我认为术语/事物命名可能会令人困惑。

在 Azure 中,您创建一个 Azure Function App,其中包含 Azure Function。我无法找到有关其工作原理的确切引用,但对我来说,Azure Function App 似乎是可扩展的部分,而不是单个 Azure Function 的部分。这是有道理的,因为所有单独的函数都是同一个程序集的一部分。

因此,单个 Function App 内的所有 Azure Function 共享相同的资源,包括线程池。这就是为什么我认为更改线程文化可能会导致其他函数出现意外问题。

如果我的观点是错误的,请告诉我。我基于对我来说逻辑上有意义的东西和这个blog post 。在讨论冷启动期间发生的情况时,它说“函数已加载到内存中”。我假设如果每个函数都是它自己的沙箱,他们会在某个地方指定它。

关于c# - 同一线程可以在 Azure Functions 中同时运行多个函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66914350/

相关文章:

javascript - Socket IO不断断开并重新连接

c# - 异步处理 WaitForExit 并获取返回值

function - 从 powershell 为 azure 函数创建函数键

c# - 使用 Task.WhenAll 但需要跟踪每个单独任务的成功

node.js - 用于 SPA 应用程序的 .NET Core Docker 镜像

Azure AD 应用程序注册将重定向 URI 限制为 256

c# - 从 Web 服务返回域对象

javascript - C# MVC Controller 无法从 Ajax POST 请求中获取十进制或 double 值

Azure 存储资源管理器 : server encountered internal error

azure - Azure Stack 的 terraform 配置