gpt4 book ai didi

node.js - 长时间运行的 App Engine 脚本 "Quitting on terminated signal"

转载 作者:行者123 更新时间:2023-12-04 02:33:52 25 4
gpt4 key购买 nike

我正在尝试通过应用引擎运行几个长时间运行的脚本。我是初学者,这是我使用 App Engine 和 express 的第一个项目。
我正在使用 express 处理 Node 中的请求。
当我(或 cron 作业)向我的任何端点发送请求时,脚本似乎运行良好,直到大约 5-10 分钟后的随机点,在那里我得到以下日志:

  • 项目收到“/_ah/stop”请求
  • “退出终止信号”消息
  • “启动程序失败:用户应用程序失败,退出代码为 -1(有关更多详细信息,请参阅 stdout/stderr 日志):信号:已终止”

  • 我无法弄清楚为什么会发生这种情况。
    我的 app.yaml:
    runtime: nodejs10
    instance_class: B2
    basic_scaling:
    max_instances: 25
    idle_timeout: 12m
    请求处理程序代码:
    app.get("/longRunningFunctionOne", async (req, res) => {
    await longRunningFunctionOne();
    res.send("DONE");
    });

    app.get("/longRunningFunctionTwo", async (req, res) => {
    await longRunningFunctionTwo();
    res.send("DONE");
    });

    app.get("/_ah/start", async (req, res) => {
    res.sendStatus(200);
    });
    在本地运行时绝对没有问题。知道我在做什么来获得过早的/_ah/stop 请求吗?因为我使用的是基本缩放,所以我不会超时。谷歌将其描述为:
    “HTTP 请求和任务队列任务为 24 小时。如果您的应用程序未在此时间限制内返回请求,App Engine 将中断请求处理程序并发出错误以供您的代码处理。”
    有任何想法吗?也许与我如何处理/_ah/start 这只是在黑暗中的一个镜头有关?

    最佳答案

    我发现,因为我向应用程序发送了非常少的请求,所以我在脚本完成之前遇到了实例空闲超时/
    因此,即使任务仍在应用程序上运行,因为它在过去约 15 分钟内没有收到 http 请求,它也会发送/_ah/stop 请求并关闭实例。
    为了在脚本运行时保持实例处于事件状态,我创建了一个函数,该函数每分钟向应用程序发送一个请求以保持运行状态并且不会达到空闲超时。
    我称它为 Beegees 的“保持活力”功能:

    const appUrl = "https://myurl.appspot.com/";

    app.get("/script1", async (req, res) => {
    res.send("running script 1");
    stayAlive(script1);
    });

    app.get("/script2", async (req, res) => {
    res.send("running script 2");
    stayAlive(script2);
    });

    app.get("/", async (req, res) => {
    res.send(" ");
    });

    app.listen(process.env.PORT || 4000, () => {
    console.log(`Listening on port ${process.env.PORT || 4000}`);
    });

    const stayAlive = async (mainAsyncFunc) => {
    const intervalId = setInterval(sendAppRequest, 60000);
    await mainAsyncFunc();
    clearInterval(intervalId);
    };

    const sendAppRequest = () => {
    console.log("Stayin alive");
    axios.get(appUrl);
    };
    看起来有点奇怪,但它有效。如果您知道更好的方法,请告诉我。

    关于node.js - 长时间运行的 App Engine 脚本 "Quitting on terminated signal",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62713011/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com