AWS lambda函数未终止线程

Posted

技术标签:

【中文标题】AWS lambda函数未终止线程【英文标题】:AWS lamda function not terminating the thread 【发布时间】:2021-12-12 14:50:14 【问题描述】:

我编写了一个从 AWS lammda 函数执行的 java 代码。在我的用例中,我想在 lambda 函数终止之前编写一些通用日志。为了实现这一点,我创建了一个新线程来监视 lambda 函数的 RemainingTimeInMillis。如果它达到某个限制,我会写一些通用消息。 现在我的问题是,即使我终止了一个线程,它也没有终止。

public class Lambda implements RequestHandler<Map<String, String>, String> 
public String handleRequests(Map<String, String> parameters, Context context) 
    LambdaTimeoutCheck thread = null;
    thread = new LambdaTimeoutCheck(context, "applicationName");
        thread.setName(threadname);
        thread.setStopTimeout(true);
        thread.start();

        /* remaining function logic  */
        System.out.println("Lambda function starts"+thread.isAlive());

        thread.shutdown();

        System.out.println("Lambda function ends"+thread.isAlive());
        return "success"




package com.pearson.autobahn.autobahnsdkheartbeat;

import com.amazonaws.services.lambda.runtime.Context;

public class LambdaTimeoutCheck extends Thread 

    private Context context;

    private String applicationName;

    private boolean isStopTimeout;


    public LambdaTimeoutCheck(Context context, String applicationName) 
        this.context = context;
        this.applicationName = applicationName;
    

    @Override
    public void run() 
        
        while (isStopTimeout()) 

            if (context.getRemainingTimeInMillis() <= 1000) 
                
                context.getLogger().log("Request ID: " + context.getAwsRequestId() + " " + applicationName
                        + " function execution about to Timeout");
                setStopTimeout(false);
             
            

        
    

    
    public void shutdown() 

        this.setStopTimeout(false);

    

    
    public boolean isStopTimeout() 
        return isStopTimeout;
    


    public void setStopTimeout(boolean isStopTimeout) 
        this.isStopTimeout = isStopTimeout;
    


thread.isAlive() 总是正确的,即使我关闭了一个线程。请任何人帮助我如何解决这个问题。

【问题讨论】:

首先,您的线程run 方法是一个繁忙的轮询 - 它会以零等待尽可能快地运行。这意味着没有那么多 CPU 可用于其他事情。接下来,您关闭线程,然后立即检查它是否已关闭。这可能需要一点时间,尤其是在线程中繁忙的轮询循环中。这段代码确实需要重构。 【参考方案1】:

就像任何 Java 程序一样:如果您的主线程需要等待另一个线程完成,您应该在子线程上调用 join()

【讨论】:

以上是关于AWS lambda函数未终止线程的主要内容,如果未能解决你的问题,请参考以下文章

AWS - 自动缩放未按指定启动/终止实例

在 C++11 中从外部终止线程

由于使用 AWS iOS 开发工具包的未捕获异常“NSInvalidArgumentException”而终止应用程序

python Lambda函数在预定时间后终止实例

异步 Lambda 函数:返回 promise 或发送 responseURL 不会终止 CloudFormation 自定义资源调用

我们可以使用 lambda 函数克隆一个终止的 emr 集群吗?在新集群中会有任何差异吗?