承诺子进程通信

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 烦恼。