Рабочий поток завершается основным потоком, как только я вызываю функцию node.js - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь заставить рабочий поток обрабатывать раунды игры на основе вопросов, получая данные из основного потока на сервере Node. Однако каждый раз, когда я вызываю функцию в рабочем потоке, она получает сигнал завершения от основного потока.

parentPort.on('message', (msg) =>{
  HEADER = msg.HEAD;
  console.log(msg);
  //console.log(QuestionSet);
  if (HEADER === HEADERSWORKER[0])
  {

  }
  else if (HEADER === HEADERSWORKER[1])
  {

  }
  else if (HEADER === HEADERSWORKER[2])
  {

  }
  else if (HEADER === HEADERSWORKER[3])
  {
    QuestionSet = msg.DATA.QUESTIONS;
    SessionID = msg.DATA.SESSIONID;
    console.log(QuestionSet);
    chooseQuestion();
    //Start Game
  }

завершение происходит только тогда, когда chooseQuestion () не закомментирован, что заставляет меня думать, что это моя проблема. Я могу ошибаться, я просто пытаюсь быстро придумать что-нибудь, чтобы закончить со школой. Спасибо за любую помощь!

1 Ответ

0 голосов
/ 06 мая 2020

Превращаю мой комментарий в ответ, поскольку он помог вам найти вашу проблему.

Внезапное завершение такого воркера, вероятно, потому что в воркере есть какое-то неперехваченное исключение, но вы не улавливаете это для регистрации того, что это такое. Очень полезно всегда регистрировать эти исключения. В вашей основной программе они часто будут регистрироваться за вас, но не всегда в рабочем. Есть два способа убедиться, что эта ошибка регистрируется, чтобы вы могли точно увидеть, что это такое. Один способ общего назначения, который вы, вероятно, должны использовать для всех ваших рабочих процессов, и один конкретный способ c для вашей конкретной функции, в которой возникла проблема.

Вот способ общего назначения. Когда вы создаете свой рабочий поток, всегда добавляйте это:

worker.on('error', err => {
    console.log(err);
    // do something else here like exit your program
});

Это даст вам консольный вывод для любой необработанной и фатальной ошибки в рабочем потоке.


Теперь в вашем укажите ситуацию c, вы знаете, что проблема возникает тогда, когда вы вызываете chooseQuestion();, вы также можете просто поставить try/catch вокруг этого, чтобы вы могли поймать и зарегистрировать ошибку:

parentPort.on('message', (msg) =>{
  try {
    HEADER = msg.HEAD;
    console.log(msg);
    //console.log(QuestionSet);
    if (HEADER === HEADERSWORKER[0])
    {

    }
    else if (HEADER === HEADERSWORKER[1])
    {

    }
    else if (HEADER === HEADERSWORKER[2])
    {

    }
    else if (HEADER === HEADERSWORKER[3])
    {
      QuestionSet = msg.DATA.QUESTIONS;
      SessionID = msg.DATA.SESSIONID;
      console.log(QuestionSet);
      chooseQuestion();
      //Start Game
    }
  } catch(e) {
     console.log(e);
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...