2012-03-05 2 views
2

.: Отказ от ответственности :.Node.js - приостановка выполнения скрипта в другом потоке

Обратите внимание, что я пытаюсь достичь чего-то с node.js, который может противоречить его принципам проектирования. Однако, поскольку node.js идет вразрез с нормой «javascript для клиентской стороны», я также пытаюсь что-то другое здесь. Пожалуйста, несите меня.

.: Фон :.

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

Я понимаю управляемую событиями технологию node.js и имею решение, основанное на обратных вызовах Async. Теперь я пытаюсь упростить это для наших более простых требований к сценариям.

.: Вопрос :.

Есть ли способ запустить сценарий (используя собственную песочницу), где выполнение может быть приостановлено во время доставки результата.

E.g.

var util = require('util'), 
vm = require('vm'), 
user = require('user'); 

vm.runInThisContext('user.WaitForProceed(); console.log('Waiting over');'); 

console.log('Finished!'); 

Пользователь - это мой собственный модуль, который будет выполнять ожидание. В основном я хочу, чтобы он сидел и блокировал эту строку в объекте vm, пока он не получил результат. После этого он будет продолжен на консоли console.log.

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

  • J
+0

Итак, кто провозгласил это так называемый NORM (!?) «javascript для клиентской стороны» - или это то, что вы (и другие) только когда-либо видели его там и заявляли, что единственное, что вы знали, норма"? Во всяком случае, нет никакого способа сделать паузу. Машина JS продолжает запускать цикл событий и останавливается только в том случае, если ничего не запускать. Таким образом, единственный способ остановить - это не иметь больше кода и больше событий (при подключенном прослушивателе событий). Единственное, что вы можете сделать, это дождаться этого события. –

+0

... так что у вас должно быть событие для прослушивания, которое запускается вашим «пользовательским» объектом. Но вы сказали, что у вас уже есть такое решение, поэтому для вас важно уйти от того, как собственно работает JS-движок, тогда вы получите лучшее чувство для этого материала :) Вы должны рассказать нам больше о том, что user.WaitForProcceed() does;) –

+0

«... поэтому для вас важно убрать это из-за того, что сам движок JS действительно работает ...» Норма как другие говорят мне, что «должно работать». Я понимаю ограничения и функциональность узла, однако, как и со всеми разработчиками, я имею дело с людьми, которые этого не делают. Однако они хотят использовать эту систему на своем пути. Я просто исследую, что возможно. – Nevar

ответ

8

Там нет никакого способа, чтобы приостановить выполнение в Node. По крайней мере, они говорят нам так :)

Есть некоторые библиотеки, которые поддерживают передовые управления потоком, как Invoke, может быть, это может помочь, но я понимаю, что это не то, что вы просили :)

Кроме того, вы могли бы реализовать цикл занятости с использованием nextTick()

Или вы можете реализовать блокирующий вызов в C (++) и предоставить его как библиотеку. Я никогда этого не делал.

Последний способ - readFileSync() названной трубе, которая закрывается на мероприятии certian.

Как вы уже упоминали, это противоречит языковым принципам, поэтому эти решения являются взломанными.

+1

Существует. Используя собственные дополнения Node.js ... см. Мой ответ. –

+0

+1 для обходного пути readFileSync/pipe. Проницательный и умный. –

+0

что readFileSync - это именно тот взлом, который мне нужен – Prospero

2

Если вы действительно хотите приостановить выполнение во время ожидания результата, вы можете попробовать работать с node-sync. Он построен на node-fibers. Ваше приложение должно быть выполнено с помощью скрипта node-fiber вместо узла. node-sync добавляет метод синхронизации к Function.prototype, который позволяет запускать его синхронно.

Также необходимо обернуть свой звонок в волокно (нить), чтобы не блокировать цикл события.

var Sync = require('sync'); 

var someAsyncFunction = function(a, b, callback) { 
    setTimeout(function() { 
     var result = a + b; 
     callback(undefined, result); 
    }, 1000); 
}; 

// Run in a fiber 
Sync(function(){ 
    // This code runs in separate fiber and does not block the event loop 

    // First argument is 'this' context 
    var result = someAsyncFunction.sync(null, 2, 3); 
    // Waiting one second 
    console.log(result); // Will output 5 
}); 

// Event loop here 

Будьте осторожны с этим. Вам нужно понять, что это не путь узла.

+0

Очень приятно. К сожалению, мне нужен главный скрипт, чтобы остановить выполнение при вызове функции синхронизации, а затем в более позднее время попросить начать заново. Это будет хорошо работать для других вещей, которые мне нужно достичь. Может быть, я могу использовать это как бегун vm и приостановить это волокно. У меня будет игра. – Nevar

+0

Если вам нужно остановить выполнение основного цикла событий во время работы функции, просто удалите Sync (function() {}); обертка из примера. Это должно приостановить цикл основного события. –

7

Если вы действительно хотите поспать выполнение процесса узла, вы можете. Однако, как вы заявляете, кажется, что вы полностью осознаете последствия.

Вот модуль НПМ, чтобы сделать это: https://github.com/ErikDubbelboer/node-sleep

Вы можете использовать его так:

var sleep = require('sleep'); 
sleep.sleep(1); //sleep for 1 sec 
sleep.usleep(2000000); //sleep for 2 sec 

Я частично пишу это для будущих посетителей, которые приходят на поиск Google: Вы не должны использовать вышеупомянутую технику. Если вы решите, что вы должны, помните, что это заблокирует ваш процесс Node, и он не сможет выполнить какую-либо дополнительную работу до истечения периода ожидания. Кроме того, вы будете нарушать каждое ожидание любого пользователя, который знает, что это программы Node.js, поскольку программы Node.js, как предполагается, не блокируются.

Удачи.

+0

Спасибо! Интересно, если это все еще приостанавливает цикл основного сообщения, если вы отключите vm. Проблема в том, что мне потребуется что-то еще, чтобы разбудить процесс раздвоения. Возможно, волокна (упомянутые ниже) будут иметь хороший результат. – Nevar

+0

Ум, модуль сна Erik Dubbelboer действительно действительно всасывает окна. Это довольно неприемлемо. –

+0

1) Он не сказал, что ему нужно решение для Windows.2) Это было опубликовано более года назад. 3) Самое главное, попытка приостановить поток выполнения Node.js - это почти во всех случаях ужасная идея. –

Смежные вопросы