Есть ли способ остановить выполнение скрипта на Node.js, используя Microsoft.AspNetCore.NodeServices? - PullRequest
0 голосов
/ 19 октября 2018

Я пытаюсь выполнить некоторый javascript на сервере Node, используя Microsoft.AspNetCore.NodeServices, с этим кодом:

JObject result = null;
var tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
var scriptTimeout = 2000;

tokenSource.CancelAfter((int) scriptTimeout);

result = await _nodeServices.InvokeExportAsync<JObject>(token, "./Node/script", "run");

InvokeExportAsync фактически предоставляет параметр CancellationToken, который успешно завершает задачу, ноПроцесс узла продолжает потреблять ЦП, пока сценарий не завершится.

Например, если я пытаюсь запустить сценарий, выполнение которого занимает 10 м, а токен отмены убивает его на 5 м, я могу видеть, что более 5 м сценарий выполняется ииспользование процессора в диспетчере задач.

1 Ответ

0 голосов
/ 22 октября 2018

Никогда не пытайтесь завершить процесс узла при отмене какой-либо задачи.

Параметр CancellationToken в InvokeAsync<T>(CancellationToken cancellationToken, string moduleName, params object[] args) не используется для завершения процесса Node.js,, но используется для отмены кода .NET, который вызывает те сценарии, которые написаны в Node.js.

Допустим, в Node.js выполняется 3 асинхронных задачи:

setTimeout(resolve, 100, 100); // task 1
setTimeout(resolve, 200, 100); // task 2
setTimeout(resolve, 300, 100); // task 3

Теперь мы хотим отменить 2-ю задачу, поскольку INodeServices - это одноэлементная служба, и JavaScript запускается в одном потоке, если мы решим завершить процесс node.js, задача 1 и задача 2 также завершатся неудачей.

Во-вторых, .NET не имеет представления о том, что следует делать в Node.js, когда задача достигает своего предела времени ожидания .Допустим, вы запросили некоторые ресурсы в Node.js, и вы освободите ресурсы, когда задача будет выполнена.Теперь вы используете .NET для отмены задачи, а как насчет ресурсов, выделенных в Node.js?

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

...