2012-05-30 6 views
5

I NodeJS für einen Web-Server verwenden, die die GET params und gibt Daten in einigem codierten Format dekodiert. Die Decodierung/Codierung erfolgt unter Verwendung des Krypto-Moduls von nodejs, das synchron zu sein scheint. Während die Zeit, die benötigt wird, um eine einzelne Anfrage zu bedienen, schnell genug ist, hat das Blockieren der Ereignisschleife dazu geführt, dass der Dienst mit Nebenläufigkeit schlecht funktioniert.Ways CPU gebunden Aufgaben in NodeJS zu implementieren

Meine Forderung ist einfach, machen den Encoder/Decoder-Funktionalität außerhalb des Ereignisschleife.

  1. separater Prozess (child_process oder Cluster)

Dies kann entweder über einen separaten Prozess für diesen Zweck allein sein, aber da die Codierungs/Decodierungs wird in dem untergeordneten Prozess blockiert dies den Kind-Prozess stoppen um neue Nachrichten zu erhalten, dh es wird nie eine Situation geben, in der zwei Zeichenketten als untergeordneter Prozess codiert sind, wird auch single-threaded sein.

  1. separater Thread für jede Anforderung (threads-a-gogo oder Faser oder node-Webworker)

für jede Anfrage einen separaten Thread Erstellen der Codier/Decodieroperation durchzuführen, aber keine der Module scheint wie erwartet zu arbeiten, dh Fäden-a-gogo durch NPM nicht installieren, Faser nicht einen separaten Thread auf run(), Knoten-Webworker not working erstellt hat.

Hat jemand ein ähnliches Problem konfrontiert, oder gibt es eine Möglichkeit, einfach Fäden in NodeJS mit einfachen Message Passing zu erstellen. Dies wird in den Knoten des Kindes Prozesse gebaut

+0

Die Antwort in # 1 Sie brauchen drehen – ControlAltDel

+0

Ihre Sperrung/aktives Warten in passive ereignisgesteuerte Stil denke ich CPU gebunden Aufgaben und Knoten sind nicht eine gute Passform. Dann ist es besser, beispielsweise Java zu verwenden und node/java effektiv miteinander kommunizieren zu lassen. – Alfred

+0

Ich verstehe, dass CPU-gebundene Aufgaben in Nodejs schrecklich ist, daher erwartet das integrierte Krypto-Modul, das separat zu behandeln. Aber gibt es keine andere Möglichkeit als Java/C zu relayen? – mdprasadeng

Antwort

1

. hier Docs:

http://nodejs.org/api/child_process.html#child_process_child_send_message_sendhandle

Sie auch Cluster verwenden:

http://nodejs.org/api/cluster.html#cluster_cluster_fork_env

Mit Cluster wäre es so etwas wie arbeiten:

if (cluster.isMaster) { 
    var worker = cluster.fork(); 
    worker.send('encodeThisString'); 

} else if (cluster.isWorker) { 
    process.on('message', function(msg) { 
    var encrypted = crypto.doSomeEncryption(msg); 
    process.send(encrypted); 
    }); 
} 
Verwandte Themen