是否可以在 lambda 函数中使用 cluster 模块?我试过这个:
'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 ');
}
}
核心数始终为 2,但我从未看到子进程日志。
更新评论示例:
我尝试实现消息模式,但我仍然没有收到 children 发送的消息。 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);
}
最佳答案
问题似乎是没有什么可以调用 exports.test
每个子进程的功能。 cluster.fork()
与 fork()
不同,使用从开头开始的不同参数调用文件的新实例。 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();
关于node.js - AWS Lambda 上的 NodeJS 集群,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43213250/