承诺子进程通信
Promisify child process communication
是否可以保证 2 个进程之间的通信?
点赞,发个消息,等收到回复,再做点什么。
我已经编写了代码,但我不知道如何解决与已发送消息相关的承诺,因为响应消息是在不同的函数中接收的,超出了承诺范围:|
var worker, job_id, promises = [];
worker = child_process.fork(__dirname + '/w.js');
worker.on('message', (message) => {
let job_id = message.job_id;
// how to resolve promises[job_id] ??
});
function send(data){
job_id++;
data.job_id = job_id;
worker.send(data);
var promise = new Promise((resolve, reject) => {
// how to resolve this in the message handler?
});
promises[job_id] = promise;
}
这个函数应该像
一样使用
send(data).then((response_message) => {
console.log(response_message);
});
不要存储承诺,存储 resolve
函数:
const worker = child_process.fork(__dirname + '/w.js');
const jobs = new Map();
let job_id;
worker.on('message', message => {
const job_id = message.job_id;
const resolve = jobs.get(job_id);
jobs.delete(job_id);
resolve(message);
});
function send(data){
data.job_id = job_id++;
worker.send(data);
return new Promise(resolve => {
jobs.set(job_id, resolve);
});
}
对 Workers 使用 promises 是个好主意,但我很难理解您的需求。您有一个巨大的优势,即能够 send/receive job_id
作为消息对象的 属性 to/from 每个作业的工作人员。这大大简化了任务。只需提前将您的 job_id
附加到您的 data
对象,然后执行以下操作;
function send(worker, data){ // data already has a job_id property
worker.send(data);
return new Promise((v,x) => worker.onmessage(v), worker.onmessageerror(x));
}
var data = {data: "someData", job_id: 1};
send(myWorker, data)
.then(m => doSomethingWith(m.job_id, m.data))
即使您没有机会发送和接收 job_id
to/from Workers,您也可以通过将它们放在数组中并通过 [=16 触发它们来跟踪承诺=].这对于分散在多个工人身上的分段工作非常有利。
function send(worker, data){ // data has no job_id property
worker.send(data);
return new Promise((v,x) => worker.onmessage(v), worker.onmessageerror(x));
}
var segmentedJobs = [job0, job1, job2],
jobPromises = segmentedJobs.map((j,i) => Promise.all([send(j),i]));
Promise.all(jobPromises)
.then(rs => rs.map(([data,id]) => doSomethingWith(data,id)));
然而,大多数情况下,分段作业会导致相关数据被相应地处理。在那种情况下,您可以减少或扫描 promises 数组,甚至不必为工作 ID 烦恼。
是否可以保证 2 个进程之间的通信?
点赞,发个消息,等收到回复,再做点什么。
我已经编写了代码,但我不知道如何解决与已发送消息相关的承诺,因为响应消息是在不同的函数中接收的,超出了承诺范围:|
var worker, job_id, promises = [];
worker = child_process.fork(__dirname + '/w.js');
worker.on('message', (message) => {
let job_id = message.job_id;
// how to resolve promises[job_id] ??
});
function send(data){
job_id++;
data.job_id = job_id;
worker.send(data);
var promise = new Promise((resolve, reject) => {
// how to resolve this in the message handler?
});
promises[job_id] = promise;
}
这个函数应该像
一样使用send(data).then((response_message) => {
console.log(response_message);
});
不要存储承诺,存储 resolve
函数:
const worker = child_process.fork(__dirname + '/w.js');
const jobs = new Map();
let job_id;
worker.on('message', message => {
const job_id = message.job_id;
const resolve = jobs.get(job_id);
jobs.delete(job_id);
resolve(message);
});
function send(data){
data.job_id = job_id++;
worker.send(data);
return new Promise(resolve => {
jobs.set(job_id, resolve);
});
}
对 Workers 使用 promises 是个好主意,但我很难理解您的需求。您有一个巨大的优势,即能够 send/receive job_id
作为消息对象的 属性 to/from 每个作业的工作人员。这大大简化了任务。只需提前将您的 job_id
附加到您的 data
对象,然后执行以下操作;
function send(worker, data){ // data already has a job_id property
worker.send(data);
return new Promise((v,x) => worker.onmessage(v), worker.onmessageerror(x));
}
var data = {data: "someData", job_id: 1};
send(myWorker, data)
.then(m => doSomethingWith(m.job_id, m.data))
即使您没有机会发送和接收 job_id
to/from Workers,您也可以通过将它们放在数组中并通过 [=16 触发它们来跟踪承诺=].这对于分散在多个工人身上的分段工作非常有利。
function send(worker, data){ // data has no job_id property
worker.send(data);
return new Promise((v,x) => worker.onmessage(v), worker.onmessageerror(x));
}
var segmentedJobs = [job0, job1, job2],
jobPromises = segmentedJobs.map((j,i) => Promise.all([send(j),i]));
Promise.all(jobPromises)
.then(rs => rs.map(([data,id]) => doSomethingWith(data,id)));
然而,大多数情况下,分段作业会导致相关数据被相应地处理。在那种情况下,您可以减少或扫描 promises 数组,甚至不必为工作 ID 烦恼。