Ros*_*ett 12 node.js aws-lambda
是否可以在lambda函数中使用集群模块?我试过这个:
'use strict';
var cluster = require('cluster');
var http = require('http');
var os = require('os');
var numCPUs = os.cpus().length;
console.log('Number of Cores : ', numCPUs);
exports.test = (event, context, callback) => {
if (cluster.isMaster) {
for (var i = 0; i < numCPUs; ++i) {
cluster.fork();
}
} else {
console.log('child process ');
}
}
Run Code Online (Sandbox Code Playgroud)
核心数始终为2,但我从未看到子进程日志.
更新评论示例:
我尝试实现消息模式,但我仍然没有收到孩子们发送的消息.for循环正确地遍历集群工作者,但从未找到消息.
'use strict';
var cluster = require('cluster');
var http = require('http');
var os = require('os');
var numCPUs = os.cpus().length;
console.log('Number of Cores : ', numCPUs);
exports.test = (event, context, callback) => {
if (cluster.isMaster) {
for (var i = 0; i < numCPUs; ++i) {
cluster.fork();
}
for (const id in cluster.workers) {
cluster.workers[id].on('message', messageHandler);
}
} else {
process.send('running');
}
};
function messageHandler(msg) {
console.log(msg);
}
Run Code Online (Sandbox Code Playgroud)
问题似乎是没有任何东西可以exports.test
为每个子进程调用该函数。cluster.fork()
使用从头开始的不同参数调用文件的新实例,与Cfork()
中的系统调用不同,C 中的系统调用克隆当前进程并从父进程和子进程中的同一行继续。
对于父进程,AWS lambda 将调用该函数,但子进程只是定义该函数,然后等待。
我会翻转你的逻辑,以便cluster.isMaster
检查发生在其他所有事情上;我在本地测试了以下内容:
'use strict';
let cluster = require('cluster')
let http = require('http')
let os = require('os')
let numCPUs = os.cpus().length
if (cluster.isMaster) {
console.log('Number of Cores : ', numCPUs);
exports.test = (event, context, callback) => {
for (let i = 0; i < numCPUs; ++i) {
cluster.fork();
}
for (const id in cluster.workers) {
cluster.workers[id].on('message', messageHandler);
}
}
} else {
process.send('running');
}
function messageHandler(msg) {
console.log(msg);
}
// The following used for local test
exports.test && exports.test();
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1039 次 |
最近记录: |