.net - 了解 Azure Functions 行为

标签 .net multithreading azure azure-functions azure-functions-runtime

我试图在思想上转向无服务器的东西,但我发现自己不明白如何移植我现有的后端代码。我需要澄清以下假设:

  1. Azure Function 是否被视为单线程代码?
  2. 在函数内使用 TPL 和 PLINQ 总是一个坏主意吗?
  3. 与常规应用服务相比,静态成员的开销是多少? 基本上,我们对 AppDomain 生命周期有任何保证吗?
  4. 如果我使用 NLoglog4net 等日志记录框架,其异步附加程序需要专用线程,我需要担心什么吗?
  5. 如何监控每个函数运行占用了多少内存?
  6. 是否可以设置 DI 容器,以便将我的依赖项注入(inject)到 Run 方法中?类似这样的事情:

    [FunctionName("ServiceBusQueueTriggerCSharp")]                    
    public async Task RunAsync(
       [ServiceBusTrigger("myqueue", AccessRights.Manage, Connection = "meconn")]
       string myQueueItem,
       IBusinessLogicService blService,
       ILogService logService,
       IMailingService mailService) {
    }
    
  7. 是否可以在 Run 方法中获取 CancellationToken 以便我可以优雅地取消/关闭?

最佳答案

  1. 这取决于您所说的“单线程代码”的含义。在较高级别上,您应该查看在函数中编写的代码,类似于在 ASP.NET MVC Controller 方法中编写代码的方式。发生单个事件(例如 HTTP 请求),运行应用程序的特定计算机已收到该事件,并且您的代码描述了如何处理该事件。 Azure Functions 的动态扩展功能永远不会进行单次执行,并将该执行透明地分布到多个线程或计算机上。如果您的场景需要基于单个事件完成大量工作,那么您应该将工作拆分到多个功能中,以便系统可以对其进行扩展。最简单的方法之一是使用队列。

  2. 在很多情况下,使用 TPL 都是有效的。例如,您的函数可能会从 3 个不同的数据源提取数据并将其合并为一个结果。在这种情况下,并行启动这 3 个异步操作是有意义的。我对 PLINQ 不太确定。我想说的是,当您出于效率目的需要并行进行大量计算时,最好将这些计算拆分为单独的函数执行(例如,使用我上面提到的队列)。

  3. 您可以使用静态变量,基本上没有任何开销,但不能保证应用程序域的生命周期。因此,您需要准备好在需要时重新初始化这些变量。

  4. Azure Functions 目前不公开每个函数的内存使用统计信息。有函数应用级别的使用统计信息,请参阅here获取信息。

  5. Azure Functions 目前不支持 DI。

  6. 是的,只需将您的函数定义为返回任务的异步函数,并让它接受取消 token ,然后将一个取消 token 传递给您。

关于.net - 了解 Azure Functions 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44760387/

相关文章:

c# - 一个类型的多个索引属性?

c++ - 在 C++ 中等待分离的线程完成

c# - 如何将.Net Core应用程序连接到Azure SQL数据库

git - 如何使用Azure Pipeline创建新标签?

azure - 将 SSL 证书分配给 Azure 应用服务

.net - 从列表中过滤或删除(T 个)

c# - .NET 4函数: Function argument question

python - IronPython 与 numpy 的 Python 速度对比

c - 如何在 C 中使用 pthreads 减少线程完成时的屏障计数

ruby - 在不弄乱输出的情况下打印 Ruby 中并行操作的输出的最简单方法是什么?