gpt4 book ai didi

node.js - ZeroMQ PUSH/PULL 通信不能通过 IPC 工作,但它可以通过 TCP 工作

转载 作者:搜寻专家 更新时间:2023-11-01 00:47:49 27 4
gpt4 key购买 nike

这是一本名为“Node.js 8 the Right Way”的书中的任务。你可以在下面看到它:

https://pp.userapi.com/c850628/v850628437/164aec/sFdn3icXb7Y.jpg

https://pp.userapi.com/c850628/v850628437/164ae4/4x02I_it_v8.jpg

这是我的解决方案:

'use strict';
const zmq = require('zeromq');
const cluster = require('cluster');

const push = zmq.socket('push');
const pull = zmq.socket('pull');

const cores_num = require('os').cpus().length;
let workers_num = 0;

push.bind('tcp://127.0.0.1:9998');
pull.bind('tcp://127.0.0.1:9999');
// push.bind('ipc://push.ipc');
// pull.bind('ipc://pull.ipc');

if (cluster.isMaster) {
for (let j = 0; j < cores_num; j++) {
cluster.fork();
}

cluster.on('online', (worker) => {
console.log(`Worker with pid ${worker.process.pid} is created!`);
});

pull.on('message', (data) => {
const response = JSON.parse(data.toString());

if (response.type === 'ready') {
if (workers_num >= 0 && workers_num < 3) {
workers_num++;

if (workers_num == 3) {
console.log('Ready!');

for (let i = 0; i < 10; i++) {
push.send(JSON.stringify({
type: 'job',
data: `This message has id ${i}`
}));
}
}
}
} else if (response.type === 'result') {
console.log(data.toString());
}
});
} else {
const worker_push = zmq.socket('push');
const worker_pull = zmq.socket('pull');

worker_pull.connect('tcp://127.0.0.1:9998');
worker_push.connect('tcp://127.0.0.1:9999');
// worker_pull.connect('ipc://push.ipc');
// worker_push.connect('ipc://pull.ipc');

worker_push.send(JSON.stringify({
type: 'ready'
}));

worker_pull.on('message', data => {
const request = JSON.parse(data);

if (request.type === 'job') {
console.log(`Process ${process.pid} got message ${request.data}`);
worker_push.send(JSON.stringify({
type: 'result',
data: `This message is a response from process ${process.pid}`,
time: Date.now()
}));
}
});
}

如您所见,它仅在 PUSH/PULL 套接字和 worker 通过 TCP 通信时有效,但我想知道它不能通过 IPC 工作的原因。

更新(引用:“路径名必须可写”下方的条件 4): enter image description here我希望你能帮助我找到问题。

最佳答案

一些事情:

您的 IPC 路径不正确:

你有ipc://push.ipc(2个斜线)你真的需要ipc:///push.ipc协议(protocol)是 ipc:// 然后你需要文件路径 /push.ipc

文件权限:

你的进程是否有写入根目录的权限?除非您以 root 身份运行,否则我认为不会。

我会将路径更改为类似 /tmp/push.ipc 的路径,它在大多数系统中对所有用户都是可写的。

在这种情况下,您的网址应该是:

ipc:///tmp/push.ipc

fork

我根本不使用 Node ,但根据我对其他语言分支的了解,我认为整个程序在不同的进程/线程中再次运行。

在这种情况下,不是每个工作人员都尝试再次 bind(),因为套接字创建/绑定(bind)代码在 if (cluster.isMaster) {

我觉得应该是这样的

if (cluster.isMaster) {

const push = zmq.socket('push');
const pull = zmq.socket('pull');
push.bind('ipc://push.ipc');
pull.bind('ipc://pull.ipc');
....
}

关于node.js - ZeroMQ PUSH/PULL 通信不能通过 IPC 工作,但它可以通过 TCP 工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56983708/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com