Azure functions 多个azure功能之间共享的静态代码?

Azure functions 多个azure功能之间共享的静态代码?,azure-functions,azure-function-app,Azure Functions,Azure Function App,假设我有一个函数应用程序,其中包含5个azure函数。在visualstudio中,我将这些函数作为类,但它们使用一些statichelper方法(以避免代码重复)。在这些helper方法中,我有一些锁,以确保在每个函数中执行特定的命令。现在我的问题是,这5个函数是否共享这些helper静态方法的相同状态?还是每个函数都在一个独立的上下文中运行? 我希望函数并行运行,所以我不希望它们被彼此阻塞 在我的例子中,azure函数不是statis,如下所示: [FunctionName("F

假设我有一个
函数应用程序
,其中包含5个
azure函数
。在
visualstudio
中,我将这些函数作为类,但它们使用一些
static
helper方法(以避免代码重复)。在这些helper方法中,我有一些锁,以确保在每个函数中执行特定的命令。现在我的问题是,这5个函数是否共享这些helper静态方法的相同状态?还是每个函数都在一个独立的上下文中运行? 我希望函数并行运行,所以我不希望它们被彼此阻塞

在我的例子中,azure函数不是statis,如下所示:

 [FunctionName("Function1")]
 public async Task Run([BlobTrigger("sample/{name}", Connection = "ConnectinoString")] Stream myBlob, string name, ILogger logger)
public static int AddTwoNumbers(int a, int b)
{ return a+b; }
public static int TransferMoney(int amount)
{
    CallBankAPI("wiretransfer", amount);
    return CallBankAPI("checkbalance");
}
public static int TransferMoney(int amount)
{
    lock(bankAPIlock) {
       CallBankAPI("wiretransfer", amount);
       return CallBankAPI("checkbalance");
    }
}

当您使用azure函数时,您必须假设函数可以在不同的服务器上运行,这样静态类就不会共享。但是使用azure函数是并行运行操作的正确选择。 我对您的用例了解不够,但您可以尝试不同的方法。 第一种方法是使用队列(存储或服务总线)将每个函数连接到下一个函数,并以正确的顺序链接操作。
第二种方法(可能是最好的方法)是使用持久函数(),它允许您按实例上下文管理执行流。

来自同一应用程序的Azure函数在同一进程中运行,只是在不同的线程上运行。因此,答案与编写经典的多线程应用程序相同。唯一的区别是该进程可以重新启动(当您不主动使用function app时,当有人调用app中的某个函数时,该进程将终止并再次启动)

如果您将功能保留在同一个应用程序中,它们将访问相同的静态对象。从不同的Azure函数并行调用它们是否安全取决于代码。例如,假设您的助手函数如下所示:

 [FunctionName("Function1")]
 public async Task Run([BlobTrigger("sample/{name}", Connection = "ConnectinoString")] Stream myBlob, string name, ILogger logger)
public static int AddTwoNumbers(int a, int b)
{ return a+b; }
public static int TransferMoney(int amount)
{
    CallBankAPI("wiretransfer", amount);
    return CallBankAPI("checkbalance");
}
public static int TransferMoney(int amount)
{
    lock(bankAPIlock) {
       CallBankAPI("wiretransfer", amount);
       return CallBankAPI("checkbalance");
    }
}
从所有5个函数中同时调用是完全安全的。 另一方面,如果助手函数如下所示:

 [FunctionName("Function1")]
 public async Task Run([BlobTrigger("sample/{name}", Connection = "ConnectinoString")] Stream myBlob, string name, ILogger logger)
public static int AddTwoNumbers(int a, int b)
{ return a+b; }
public static int TransferMoney(int amount)
{
    CallBankAPI("wiretransfer", amount);
    return CallBankAPI("checkbalance");
}
public static int TransferMoney(int amount)
{
    lock(bankAPIlock) {
       CallBankAPI("wiretransfer", amount);
       return CallBankAPI("checkbalance");
    }
}
您不能并行调用此函数,因为结果将不可预测-此处存在竞争条件,因此您需要这样编写:

 [FunctionName("Function1")]
 public async Task Run([BlobTrigger("sample/{name}", Connection = "ConnectinoString")] Stream myBlob, string name, ILogger logger)
public static int AddTwoNumbers(int a, int b)
{ return a+b; }
public static int TransferMoney(int amount)
{
    CallBankAPI("wiretransfer", amount);
    return CallBankAPI("checkbalance");
}
public static int TransferMoney(int amount)
{
    lock(bankAPIlock) {
       CallBankAPI("wiretransfer", amount);
       return CallBankAPI("checkbalance");
    }
}
因此,在不知道助手函数在做什么的情况下,很难判断它们是否需要锁定