我有一个小节点模块调用fork
系统调用来分叉正在运行的进程。当我尝试从子进程调用aws-sdk
函数Kinesis.putRecord
时,调用不会发生。从父进程调用工作正常。
为了说明这一点,以下两个代码片段仅对父进程或子进程是否执行对putRecord
的调用有所不同。
在第一个代码段中,调用由父进程执行,调用正常。
const aws = require('aws-sdk');
const fork = require('fork');
module.exports.handler = (event, context, callback) => {
const isChild = fork.fork();
if (!isChild) { // Parent
const kinesis = new aws.Kinesis()
const record = {
Data: "Lorem ipsum",
PartitionKey: "123456",
StreamName: process.env.STREAM_NAME,
}
kinesis.putRecord(record, (err, data) => {
if (err) {
callback(null, {message: 'Encountered error in kinesis', err});
} else {
callback(null, {message: 'Successfully ran in kinesis', data});
fork.wait();
}
})
} else { // Child
process.exit();
}
};
另一方面,在第二个代码片段中,子进程执行调用,并且不执行调用。特别是在此示例中,Lambda执行超时。
const aws = require('aws-sdk');
const fork = require('fork');
module.exports.handler = (event, context, callback) => {
const isChild = fork.fork();
if (isChild) { // Child
const kinesis = new aws.Kinesis()
const record = {
Data: "Lorem ipsum",
PartitionKey: "123456",
StreamName: process.env.STREAM_NAME,
}
kinesis.putRecord(record, (err, data) => {
if (err) {
callback(null, {message: 'Encountered error in kinesis', err});
} else {
callback(null, {message: 'Successfully ran in kinesis', data});
}
})
} else { // Parent
fork.wait();
}
};
可以找到fork模块here。
我正在使用node.js版本6.10.3。
答案 0 :(得分:0)
Node.js基于单线程架构。 AWS Lambdas经过精心设计和优化,可执行相对短期的功能。您的lambda最有可能只在运行时分配一个虚拟CPU。
你试图通过并行运行两个lambdas无法解决的问题解决了什么问题?有many ways of triggering lambdas因此不会太难。甚至还有calling one lambda from another asynchronously的概念。