Как остановить асинхронный поток в Node.js - PullRequest
0 голосов
/ 26 сентября 2018

Мне нужна огромная помощь или совет, пожалуйста.Мне нужно подчеркнуть сервер Node.js - просто высокая загрузка ЦП - потому что мне нужно протестировать инструмент мониторинга рынка.
Сценарий таков: мне нужна кнопка, чтобы запустить стресс, и другие, чтобы остановить его.
Я пытался использовать Loadtest, но при запуске он не останавливался программно, только если я закрывал его вручную (если кто-тоесть какой-нибудь совет по этому поводу, пожалуйста!).Затем я попытался сделать простой цикл while, потому что думал, что смогу остановить его, но это не сработало ..

var shouldRun = true;

app.get("/cpuup", (req, res) => {
  var result = 0;
  while (shouldRun) {
    result += Math.random() * Math.random();
  }
  return result;
});

app.get("/cpudown", (req, res) => {
  shouldRun = false;
});

Может ли кто-нибудь дать мне совет о другом способе сделать это, или я могу »остановить асинхронный поток?Спасибо!

1 Ответ

0 голосов
/ 26 сентября 2018

Синхронный цикл while блокируется, shouldRun = false никогда не будет достигнут.

В приложениях, требующих параллелизма, таких как веб-сервер, следует избегать операций блокировки.

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

Как объяснено в этом ответе , промежуточное программное обеспечение Express и обработчики маршрутов должны обрабатывать отклонения обещаний дляобеспечить правильную обработку ошибок, в случае функции async это требует try..catch:

app.get("/cpuup", async (req, res, next) => {
  try {
    var result = 0;
    while (shouldRun) {
      result += Math.random() * Math.random();
      await null; // a delay
    }
    res.send('' + result);
  } catch (err) {
    next(error);
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...