为什么此同步代码代码_NOT_慢?

发布于 2025-02-08 23:44:54 字数 1525 浏览 1 评论 0原文

功能

我具有以下Azure函数的

public class Function {

    final RefWrapper toReturn = new RefWrapper();

    private static class RefWrapper {
        String value = "";
    }

    @FunctionName("raceConditionTest")
    public synchronized HttpResponseMessage raceConditionTest(
        @HttpTrigger(
            name = "req",
            methods = {HttpMethod.GET},
            authLevel = AuthorizationLevel.ANONYMOUS
        ),
        HttpRequestMessage<Optional<String>> request,
        final ExecutionContext context
    ) throws IOException {
        toReturn.value = request.getHeaders().getOrDefault("x-return-me", "0");
        Thread.sleep(1000 * 10);
        return request.createResponseBuilder(HttpStatus.OK).body(toReturn.value).build();
    }
}

,它显示了种族条件:当我并行10次调用此功能时,标头的值不同,所有十个请求都会返回相同的值,如预期 - 实现了种族条件。如果我同步,如下所示:

@FunctionName("raceConditionTest")
public synchronized HttpResponseMessage raceConditionTest( /*args*/ ) {
    synchronized (toReturn) {
        toReturn.value = request.getHeaders().getOrDefault("x-return-me", "0");
        Thread.sleep(1000 * 10);       
        return request.createResponseBuilder(HttpStatus.OK).body(toReturn.value).build();
    }
}

并发送并行请求,那么,如预期的那样,每个请求正确返回输入值,则可以防止比赛条件。

但是,出乎意料的是,所有请求同时返回,它们似乎并没有排队。我已经查看了我的指标,并且没有创建其他功能实例。

问题

为什么此代码不慢,为什么请求不必等待?我假设此行为与Azure函数运行时有关 - 是否保证,记录或合理地期望稳定?

The Function

I have the following Azure Function, which displays a race condition:

public class Function {

    final RefWrapper toReturn = new RefWrapper();

    private static class RefWrapper {
        String value = "";
    }

    @FunctionName("raceConditionTest")
    public synchronized HttpResponseMessage raceConditionTest(
        @HttpTrigger(
            name = "req",
            methods = {HttpMethod.GET},
            authLevel = AuthorizationLevel.ANONYMOUS
        ),
        HttpRequestMessage<Optional<String>> request,
        final ExecutionContext context
    ) throws IOException {
        toReturn.value = request.getHeaders().getOrDefault("x-return-me", "0");
        Thread.sleep(1000 * 10);
        return request.createResponseBuilder(HttpStatus.OK).body(toReturn.value).build();
    }
}

When I call this function 10 times in parallel, with a different value in the header, all ten requests return the same value, as is expected - a race condition is achieved. If I synchronise, as seen here:

@FunctionName("raceConditionTest")
public synchronized HttpResponseMessage raceConditionTest( /*args*/ ) {
    synchronized (toReturn) {
        toReturn.value = request.getHeaders().getOrDefault("x-return-me", "0");
        Thread.sleep(1000 * 10);       
        return request.createResponseBuilder(HttpStatus.OK).body(toReturn.value).build();
    }
}

and send parallel requests, then, as expected, each request returns the input value correctly, the race condition has been prevent.

However, unexpectedly, all requests return at the same time, they don't seem to queue. I've looked at my metrics, and no additional function instances are being created.

The Question

So why is this code not slow, why do requests not have to wait? I'm assuming this behaviour is related to the Azure Function runtime - is it guaranteed, documented, or reasonably expected to be stable?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文