Могу ли я разрешить "разрывы" в цикле for с node.js - PullRequest
1 голос
/ 21 сентября 2011

У меня огромный цикл for, и я хочу разрешить ввод-вывод во время обработки.Может быть, каждые 10000 итераций.Можно ли как-нибудь разрешить дополнительный ввод / вывод таким образом?

Ответы [ 2 ]

5 голосов
/ 21 сентября 2011

Большой цикл for - это просто блокирование всего сервера.

У вас есть два варианта: либо поместить цикл for в новый поток, либо сделать его асинхронным.

var data = [];
var next = function(i) {
  // do thing with data [i];
  process.nextTick(next.bind(this, i + 1));
};

process.nextTick(next.bind(this, 0));

Я не рекомендую последнее. Вы просто реализуете простое временное соединение, которое планировщик процессов на уровне ОС может сделать лучше, чем вы.

var exec = require("child_process").exec

var s = exec("node " + filename, function (err, stdout, stderr) {
  stdout.on("data", function() { 
    // handle data
  });
});

В качестве альтернативы используйте что-то вроде hook.io для управления процессами.

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

0 голосов
/ 21 сентября 2011

Может быть, что-то вроде этого, чтобы разбить ваш цикл на куски ...

Вместо:

for (var i=0; i<len; i++) {
  doSomething(i);
  }

Что-то вроде:

var i = 0, limit;
while (i < len) {
  limit = (i+10000);
  if (limit > len)
    limit = len;
  process.nextTick(function(){
     for (; i<limit; i++) {
      doSomething(i);
     }
    });
  }
}

NextTick ()Вызов call дает шанс другим событиям попасть туда, но он по-прежнему выполняет большинство циклов синхронно, что (я предполагаю) будет намного быстрее, чем создание нового события для каждой итерации.И, очевидно, вы можете экспериментировать с числом (10 000), пока не получите желаемые результаты.

Теоретически вы также можете использовать setTimeout () вместо nextTick (), если окажется, что предоставление другихобрабатывает несколько больший «временной интервал» помогает.Это дает вам еще одну переменную (время ожидания в миллисекундах), которую вы можете использовать для настройки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...