首页 > 解决方案 > 在不需要时将函数编写为异步函数是否有好处?

问题描述

它写道:

使用异步代码但避免阻塞调用

异步编程是推荐的最佳实践,尤其是在涉及阻塞 I/O 操作时。

https://docs.microsoft.com/en-us/azure/azure-functions/functions-best-practices#use-async-code-but-avoid-blocking-calls

我有不包含“等待”行的函数。将这些函数编写为异步有好处吗?

标签: javascriptazure-functions

解决方案


您引用的文档包含一些关于为什么这是一个好主意的提示。

使用异步代码但避免阻塞调用

异步编程是推荐的最佳实践,尤其是在涉及阻塞 I/O 操作时。

在 C# 中,始终避免在 Task 实例上引用 Result 属性或调用 Wait 方法。这种方法会导致线程 耗尽。

小费

如果您计划使用 HTTP 或 WebHook 绑定,请计划避免可能由 HttpClient 的不正确实例化导致的端口 耗尽。有关详细信息,请参阅如何在 Azure Functions 中管理连接。


当您有阻塞调用时,它们会占用一些资源,例如线程/端口。可以由各种功能共享。

例如说

  • 您的实施取决于可以并行处理 1000 个请求的第 3 方服务。
  • 您的工作进程数为 4

然后:

  1. 如果所有 4 个都触发了一些外部作业并等到它完成,那么您将只能并行运行其中的 4 个。如果您的用户希望能够并行运行 1000 个作业,则您必须扩展到(并支付)250 个应用程序实例。

  2. 如果每个函数都执行以下操作:

    • 异步触发每个作业并记下作业 ID
    • 在循环中检查每个作业 ID 的作业状态

    然后,单个应用程序功能将能够并行处理 1000 个请求。

在此处输入图像描述


我有不包含“等待”行的函数。将这些函数编写为异步有好处吗?

异步仍然很好,除非你确定你已经考虑了所有未来的需求。


推荐阅读