【发布时间】:2016-03-14 19:01:47
【问题描述】:
您好,我已经为 Kinesis 流创建了一个 AWS Lambda 函数,批量大小为 100,我正在尝试在多线程环境中执行它,但问题是在多线程环境中,与单线程相比,它的运行速度非常慢线程.. 就像我可以分享你的数字:对于 512 MB 和 60 秒超时,Lambda 函数在 684 毫秒内执行 955 条记录,在 435 毫秒内执行 1031 条记录,对于多线程,它在 878808 毫秒内执行 430 条记录,在 893862 毫秒内执行 433 条记录相同的内存(即 512 MB 和 60 秒超时)
以下是我在多线程行为中执行的 Lambda 函数代码:
public String myHandler(final KinesisEvent kinesisEvent, final Context context) {
Thread thread = new Thread(new Runnable(){
//@Override
public void run() {
int singleRecord=0;
long starttime=System.currentTimeMillis();
//LambdaLogger lambdaLogger=context.getLogger();
for(KinesisEventRecord rec : kinesisEvent.getRecords())
{
singleRecord=0;
System.out.println("Kinesis Record inside is:"+new String(rec.getKinesis().getData().array()));
//count++;
singleRecord++;
// System.out.println(new String(rec.getKinesis().getData().array()));
}
count=count+singleRecord;
long endtime=System.currentTimeMillis();
long totaltime = endtime-starttime;
time=time+totaltime;
System.out.println("Time required to execute single Lambda function for "+singleRecord+" records is"+" :: "+totaltime+" milliseconds");
System.out.println("Total time required to execute Lambda function for "+count+" records is"+" :: "+time+" milliseconds");
}
});
thread.start();
return null;
} //end of handler method
Lambda 函数在多线程环境中执行是否缓慢?我想知道这个多线程 Lambda 函数处理缓慢的原因可能是什么?如果我希望这个函数比单线程函数工作得更快,那么我应该在这段代码中做哪些更改?
【问题讨论】:
-
现在更清楚了,谢谢。但是仍然 - 每个执行元素启动一个新线程的好处在哪里?
-
@Jan docs.aws.amazon.com/lambda/latest/dg/java-gs.html != java 8 lambda 函数,虽然概念相似,但您定义了一个在云中运行的函数。
-
@Akshay:你能分享单线程代码来比较吗?
count定义在哪里? -
我不知道为什么线程会这么慢,但是通过将代码从接收请求的线程移动到新线程然后在该背景上等待,它不会变得更快线程完成。如果您想通过多线程使其更快,则必须并行执行某些操作。您的代码中仍然只有 1 个活动线程 - 加上创建新线程的开销。 AWS 将尽可能多地并行调度您的 lambda。无需编写非阻塞处理程序方法。
-
是的,我已经分享了下面的单线程代码.....
标签: java multithreading amazon-kinesis aws-lambda