【问题标题】:worker thread won't respond after first message?工作线程在第一条消息后不会响应?
【发布时间】:2020-03-01 13:30:27
【问题描述】:

我正在制作一个服务器脚本,为了让主机和客户端都能更轻松地做他们想做的事,我制作了一个使用 nw.js(带有可视界面)运行的可定制服务器脚本。所述脚本是使用网络工作者制作的,因为 nw.js 在支持工作者线程方面存在问题。

现在 NW.js 解决了他们与工作线程有关的问题,我一直在尝试将 Web 工作人员内部的所有内容移动到工作线程,但是有一个问题:当主线程从第二个线程接收到答案时线程,后者停止响应任何后续消息。

例如,使用 NW.js 或 Node.js 本身运行以下代码将只返回一次“pong”

const { Worker } = require('worker_threads');

const worker = new Worker('const { parentPort } = require("worker_threads");parentPort.once("message",message => parentPort.postMessage({ pong: message }));  ', { eval: true });
worker.on('message', message => console.log(message));      
worker.postMessage('ping');
worker.postMessage('ping');

如何配置工作程序,以便它在收到第一条消息后继续响应它收到的任何消息?

【问题讨论】:

    标签: node.js multithreading nwjs worker-thread


    【解决方案1】:

    因为你使用EventEmitter.once() 方法。根据documentation,此方法执行以下操作:

    为名为 eventName 的事件添加一次性监听函数。 下次触发 eventName,这个监听器被移除然后 被调用。

    如果您需要您的工作人员处理多个事件,请使用EventEmitter.on()

    const worker = new Worker('const { parentPort } = require("worker_threads");' +
       'parentPort.on("message",message => parentPort.postMessage({ pong: message }));',
       { eval: true });
    

    【讨论】:

      猜你喜欢
      • 2016-08-06
      • 2019-10-13
      • 1970-01-01
      • 1970-01-01
      • 2015-11-05
      • 2013-10-09
      • 1970-01-01
      • 2015-12-22
      • 1970-01-01
      相关资源
      最近更新 更多