рабочий поток не будет отвечать после первого сообщения? - PullRequest
1 голос
/ 01 марта 2020

Я делаю серверный скрипт и, чтобы как хосты, так и клиенты могли делать то, что они хотят, я создал настраиваемый серверный скрипт, который запускается с использованием nw. js (с визуальным интерфейсом). Сценарий был создан с использованием веб-работников, поскольку у nw. js возникли проблемы с поддержкой рабочих потоков.

Теперь, когда NW. js исправили их проблемы с рабочими потоками, я пытался переместить все вещи, которые были внутри веб-работников для рабочих потоков, но есть проблема: когда основной поток получает ответ от второго потока, последний перестает отвечать на любое последующее сообщение.

Например, выполнение следующего код с 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');

Как мне настроить работника так, чтобы он продолжал отвечать на все сообщения, которые он получает после первого?

1 Ответ

1 голос
/ 01 марта 2020

Потому что вы используете EventEmitter.once() метод. Согласно документации этот метод выполняет следующие действия:

Добавляет одноразовую функцию прослушивателя для события с именем eventName. в следующий раз, когда вызывается eventName, этот слушатель удаляется , а затем вызывается.

Если вам нужен ваш работник для обработки более одного события используйте EventEmitter.on()

const worker = new Worker('const { parentPort } = require("worker_threads");' +
   'parentPort.on("message",message => parentPort.postMessage({ pong: message }));',
   { eval: true });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...