问: AWS Lambda会重用函数实例吗?
为了提高性能,AWS Lambda可能会选择保留您的函数的一个实例,并重用它来为后续请求提供服务,而不是创建新的副本。您的代码不应该假设这种情况总是会发生。
问题是关于Java
并发性。如果我有一个处理程序的类,比如:
public class MyHandler {
private Foo foo;
public void handler(Map<String,String> request, Context context) {
...
}
}
那么,在这里访问和使用对象变量foo
是否是线程安全的呢?
换句话说: AWS lambda可以为不同的调用同时使用相同的对象吗?
API函数是在基于事件的源上处理的,特别是由方法调用。
EDIT-2当你想要实现某种到外部资源的连接池时,就会出现这样的问题,所以我想把到外部资源的连接作为一个对象变量。它实际上可以像预期的那样工作,但是我害怕并发问题。
编辑-3更具体地说,我想知道: AWS lambda的处理程序的实例是否可以共享公共堆(内存)或不共享?
发布于 2016-06-27 01:33:40
AWS lambda可以为不同的调用同时使用相同的对象吗?
AWS lambda处理程序的实例是否可以共享公共堆(内存)?
一个强有力的,明确的否定。AWS Lambda处理程序的实例甚至不能共享文件(在/tmp
中)。
AWS Lambda容器不能被重用于两个或更多并发存在的Lambda函数调用,因为这将打破隔离要求:
Q: How does AWS Lambda isolate my code?
每个AWS Lambda函数都在自己的隔离环境中运行,具有自己的资源和文件系统视图。
how lambda functions work官方描述中的部分“AWS Lambda如何运行我的代码?容器模型”指出:
在执行Lambda函数后,AWS Lambda会在一段时间内维护容器,以期待另一个Lambda函数调用。实际上,如果再次调用Lambda函数时AWS Lambda选择重用容器,则服务将在Lambda函数完成后冻结容器,并解冻容器以供重用。这种容器重用方法具有以下含义:
之前检查连接是否已存在
如果您的Lambda函数选择重用容器,则在函数结束时未完成的
正如您所看到的,当尝试利用容器重用时,绝对没有关于Lambda函数的多个并发调用之间的竞争条件的警告。唯一的注意事项是“不要依赖它!”。
发布于 2019-06-26 08:39:44
在使用AWS Lambda时,利用执行上下文重用绝对是一种实践(请参阅AWS Lambda Best Practices)。但这不适用于并发执行,因为对于并发执行,会创建一个新的容器,从而创建新的上下文。简而言之,对于并发执行,如果一个处理程序更改了值,另一个处理程序将不会获得新值。
发布于 2021-04-21 22:49:41
正如我所看到的,Lambda没有并发问题。只有一个调用“拥有”容器。第二次调用将获得另一个容器(或者可能必须等到第一个容器变为空闲)。
但是我没有找到任何保证Java内存可见性问题不会发生的保证。在这种情况下,第一次调用所做的更改可能对第二次调用不可见。或者,第一次调用的更改将在第二次调用所做的更改之后写入RAM。
在大多数情况下,可见性问题的处理方式与并发问题的处理方式相同。因此,我建议开发线程安全(或同步)的Lambda函数。至少只要AWS不会给我们保证,他们会在每次调用后做一些事情来将CPU状态刷新到内存中。
https://stackoverflow.com/questions/38016683
复制相似问题