AWS Lambda, Puppeteer, функция никогда не завершается

У меня есть функция Lambda, которая запускает Puppeteer. Все работает нормально и возвращает то, что я хочу. Но после возврата результатов Lambda никогда не завершается, и у нее истекает время ожидания. Я не использую кукловоды browser.close () из-за предотвращения открытия 1000 браузеров и страниц из-за рекурсивных вызовов.

Это мой обработчик:

exports.handler = function (event, context, callback) {
const promises = [];
    const records = event["Records"];
    for (let record of records) {
        const message = JSON.parse(record.body);
       const promise = scrapper.parseEngine(message.commands, null, null, null);
        promises.push(promise);
    }
    Promise.all(promises).then((data) => {
        console.log('promise finished');
        callback(null, data);
}).catch((err) => {
    console.log('error', err);
    callback(err);
    });

};

а это журнал CloudWatch

CloudWatchLog


person ROKIKOKI    schedule 17.10.2018    source источник


Ответы (1)


Если вы не используете browser.close(), вам нужно запустить функцию, установив context.callbackWaitsForEmptyEventLoop = false.

Это связано с тем, что лямбда-функция не завершает работу на callback по умолчанию, а фактически ожидает, пока узел не выполнит свой список задач. В вашей лямбде список задач включает ожидание выхода кукловода, поэтому лямбда не останавливается вскоре после callback

Дополнительная информация здесь: (https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.html#nodejs-prog-model-context-properties)

person thomasmichaelwallace    schedule 17.10.2018
comment
О, спасибо, сэр, я провел целый день. Но я думаю, что позже у меня будут проблемы, потому что браузер все еще будет существовать на VPC в течение некоторого времени, и отправка других запросов может вызвать конфликты: D, но спасибо - person ROKIKOKI; 17.10.2018
comment
Интересно. Интересно, есть ли аналогичная настройка для GCP. : D - person Md. Abu Taher; 17.10.2018
comment
На первый взгляд, нет. Хотя будет интересно посмотреть, что они делают. У меня всегда складывалось впечатление, что этот подход существует из-за того, как AWS собирает журналы - если вы вернетесь немедленно, вы можете не дать ни одному потоку время для очистки. - person thomasmichaelwallace; 18.10.2018