Сделать узел законченным после завершения обработки, даже если цикл обработки событий не пуст? - PullRequest
0 голосов
/ 12 апреля 2019

Я делаю локальный симулятор для AWS Lambda, где можно установить context.callbackWaitsForEmptyEventLoop = false; - это позволяет запускать лямбду без отключения от базы данных .Это используется для того, чтобы Lambda-соединения оставались открытыми на MongoDB, RethinkDB и т. Д.

Я хотел бы подчеркнуть, что Я знаю, что обычная, не лямбда-функция, которая здесь делается,отключить базу данных .Однако более низкая задержка с использованием callbackWaitsForEmptyEventLoop делает его предпочтительным для Lambdas, поскольку он позволяет микровому компьютеру оставаться подключенным к базе данных, а для последующих лямбд - повторно использовать то же соединение.

Я хотел бы смоделировать AWSПоведение локально.

Как создать эквивалент callbackWaitsForEmptyEventLoop = false (т. Е. Выйти, как только будет завершена вся обработка, а не ждать, пока цикл событий будет пустым?

Вот некоторый демонстрационный код. Измените FUNCTION_NAME на 'connectOnly' или 'connectAndDisconnect', чтобы продемонстрировать поведение.

Прямо сейчас 'connectAndDisconnect' работает, но 'connectOnly' - нет - он заканчивает обработку,но никогда не выйдет из узла, так как соединение все еще открыто.

let spawn = require('child_process').spawn
var log = console.log.bind(console)
let minify = script=> '"' + script.replace(/\n/g, '').trim() + '"'

var functions = {
    connectAndDisconnect: `const rethinkdb = require('rethinkdb');    
    ;(async function(request, context) { 
        var connection = await rethinkdb.connect({ host: 'localhost', port: 28015 }); 
        await connection.close();
        console.log('I connected successfully!');
    })();`,
    connectOnly: `const rethinkdb = require('rethinkdb');    
    ;(async function(request, context) { 
        var connection = await rethinkdb.connect({ host: 'localhost', port: 28015 }); 
        console.log('I connected successfully!');
    })();`
}

const FUNCTION_NAME = 'connectOnly'

log(`Testing ${FUNCTION_NAME}`)

var functionToTest = functions[FUNCTION_NAME]

var child = spawn('node', ['-e', minify(functionToTest)], { 
    shell: true,
    stdio: [0, 'pipe', 'pipe'],
    cwd: 'C:\\Users\\mikem\\OneDrive\\Documents\\appless\\documentdb-arc-test\\src\\http\\get-index',
    env: {}
})

var completed = false;

let timeout = 5000;
// bake a timeout
setTimeout(function () {
    log(`Timed out after ${timeout} ms!`)
    child.kill()
}, timeout)

// 'close' will occur if the process finishes naturally
// 'exit' will occur if the process is killed
console.log(`What we want is to be see a 'close' event using the 'connectOnly' code above`)
;['close', 'exit'].forEach(function(event){
    child.on(event, function () {
        log(`'${event}' event happened!`)
        if ( ! completed ) {
            completed = true
            log(`Done!`)
        }
    })
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...